diff --git a/TODO.md b/TODO.md index ca5a828..b0f6eed 100644 --- a/TODO.md +++ b/TODO.md @@ -18,9 +18,9 @@ # -- [ ] Ma'at: Stock Picking algorithm designed to help build wallets for the users based on their profile and provide insights in the stocks page, such as its grade and recommended signal (Buy, Hold or Sell) based on Value Investing fundamentals +- [ ] Oxossi: Stock Picking algorithm designed to help build wallets for the users based on their profile and provide insights in the stocks page, such as its grade and recommended signal (Buy, Hold or Sell) based on Value Investing fundamentals - [ ] Use the inverse stocks corr matrix to recommend stocks if they are with an score of 75 > -- [ ] Thoth: Wallet Management System for the users. +- [ ] Iyagba: Wallet Management System for the users. - [ ] Import/Export via .xlsx (B3 Portal) or use get_positions() from MT5 - [ ] Ogum: Algo Trading System for the users. - [ ] Execution engine via MetaTrader 5 (MT5) for XP/BTG/Genial accounts diff --git a/docs/authentication.md b/docs/authentication.md index 46ddd72..804222e 100644 --- a/docs/authentication.md +++ b/docs/authentication.md @@ -1,189 +1,174 @@ # Authentication Management -A secure authentication system for the Mansa ecosystem, utilizing **JSON Web Tokens (JWT)** and **HttpOnly Cookies** to manage user sessions and access levels. This module ensures that user data is protected against common attacks like XSS by restricting token access to the server-side. - -Built to integrate seamlessly with the main database and provide granular permission control across all Mansa services. - -**Note**: This system uses **fastapi-sso** for OAuth2 authentication, providing a standardized and secure OAuth flow. - -## Usage -1. Environment configuration (`.env`): - ```env - # - #$ DATABASE CONFIGURATION - # - USER_MYSQL_USER=user - USER_MYSQL_PASSWORD=password - USER_MYSQL_HOST=localhost - USER_MYSQL_DATABASE=database - - # - #$ AUTH SYSTEM - # - USER_ENABLED=TRUE - USER_HOST=localhost - USER_PORT=3200 - - # Secret key for JWT signing - JWT_SECRET_KEY=your_super_secret_jwt_key - - # Session secret key (for OAuth state management) - SESSION_SECRET_KEY=your_session_secret_key - - # Google OAuth2 - GOOGLE_CLIENT.ID=your_id - GOOGLE_CLIENT.SECRET=your_secret - GOOGLE_REDIRECT.URI=http://localhost:3200/auth/callback - ``` - -## Roles and Permissions -The system uses a string-based multi-role system to control access. Users can have one or more roles simultaneously, separated by commas in the database. - -| Role | Name | Description | -| :--- | :--- | :--- | -| **USER** | Standard | Default access to basic features (Thoth and Ma'at). | -| **DEVELOPER** | Developer | Access to the developer tab and API Key generation. | -| **PREMIUM** | Premium | Access to all MUSA models and advanced algorithms. | -| **ADMIN** | Admin | Full control over the system (includes all roles). | - -## API Endpoints +JWT (HS256) + HttpOnly cookie + DB-tracked sessions for the Mansa ecosystem (`USER` service, prefix `/auth`). + +## Token & session lifetime + +- Sessions and tokens live **30 days / 720 hours** (`main/app/authentication/constants.py:3-4`: `SESSION_EXPIRY_DAYS = 30`, `TOKEN_EXPIRY_HOURS = 720`). +- JWT payload: `{"userId", "sessionId", "exp"}`; signed HS256 with `Config.USER.JWT_SECRET_KEY` (`main/app/authentication/util.py:31-41`, verify `:44-51`). +- `SessionManager.createSession` defaults `expiresAt = now + 30d`; `validateSession` lazily deactivates expired rows (`main/app/authentication/session.py:32-65,126-144`). + +## Token extraction order + +`extractTokenPayload` (`main/app/authentication/util.py:54-62`) checks in this order: + +1. `X-Access-Token` header +2. `Authorization: Bearer ` +3. `mansa_token` cookie + +Missing token → 401 `Session not found`; expired → 401 `Token expired`; bad signature → 401 `Invalid token`. + +## Cookie handling (conditional Secure) + +`issueSessionCookie` (`main/controller/authentication_controller.py:45-62`): + +- Cookie name `mansa_token`, path `/`, SameSite `lax`, HttpOnly. +- `Secure` is **conditional**: true only when the request is HTTPS — detected via `X-Forwarded-Proto` first, else `request.url.scheme` (`isSecureScheme`, `:28-37`). +- Domain via `resolveCookieDomain` (`:40-42`): `localhost` when host is `localhost`/`127.0.0.1`, otherwise the request hostname. +- Logout deletes the cookie with the same flags (`:141-149`) and revokes the DB session found in the token (`:128-139`). + +## Session data model (family-only) + +`UserSession` (`main/models/user_session.py:11-21`) stores **only**: + +| Column | Source | +| :--- | :--- | +| `sessionId` / `userId` / `accessTokenHash` | generated at creation | +| `deviceType` | `desktop` / `mobile` / `tablet`, else `None` (family-only) | +| `browser` | `parsed.browser.family`, `None` if `Other` | +| `operatingSystem` | `parsed.os.family`, `None` if `Other` | +| `userAgent` | raw `User-Agent` header (may be `""`) | +| `isActive` / `createdAt` / `lastActivityAt` / `expiresAt` | lifecycle timestamps | + +Parsing: `parseDeviceFields` (`main/app/authentication/session.py:13-27`, stored `:45-59`). There is **no** `browserVersion`, `osVersion`, `ipAddress`, `deviceName`, or fingerprint column — any doc claiming them is stale. + +`updateLastActive` (`session.py:117-124`) exists but has **zero callers — dead / not wired**. `lastActivityAt` is set at creation and never refreshed. + +## Roles and permissions + +(`main/utils/roles.py:5-26` — note: there is **no** `DEVELOPER` role.) + +| Role | Effective permissions | +| :--- | :--- | +| `USER` | none (`Permission.NONE`) | +| `PREMIUM` | `USE_PROMETHEUS` + `PROMETHEUS_EXTENDED_MEMORIES` | +| `DEVELOPER_STARTER` | = `USER` (no extra permissions) | +| `DEVELOPER_ENTERPRISE` | = `DEVELOPER_STARTER` (no extra permissions) | +| `ADMIN` | all (`Permission.ALL()`), bypasses checks | + +Only two permissions exist: `USE_PROMETHEUS`, `PROMETHEUS_EXTENDED_MEMORIES`. There are no `VIEW_PROFILE` / `USE_THOTH` / `USE_MAAT` / `USE_OGUM` permissions — delete any such claims. + +## Rate limits + +(`main/controller/authentication_controller.py:71,101,154,172`) + +| Endpoint | Limit | +| :--- | :--- | +| `POST /auth/register` | 10/minute | +| `POST /auth/login` | 10/minute | +| `GET /auth/google` | 5/minute | +| `GET /auth/callback` | 5/minute | + +## API endpoints ### Health Check + ```bash curl http://localhost:3200/auth/health ``` -Returns service status. ### User Registration -Creates a new account with the default role `USER`. + +Creates account (default role `USER`), then auto-logs in and sets the cookie. + ```bash curl -X POST "http://localhost:3200/auth/register" \ -H "Content-Type: application/json" \ -d '{"username": "user", "email": "user@example.com", "password": "password123"}' ``` +Returns `{message, accessToken, tokenType: "bearer", user}` and sets `mansa_token`. + ### User Login -Authenticates the user and initiates a session. + ```bash curl -X POST "http://localhost:3200/auth/login" \ -H "Content-Type: application/json" \ -d '{"username": "user", "password": "password123"}' ``` -**Response Behavior:** -- Sets a `mansa_token` cookie (HttpOnly, Secure, SameSite=Lax). -- Returns a JSON object with `accessToken`, user metadata, and a list of `roles`. -- Creates a new session in the database with device information. -### Profile (Me) -Retrieves the logged-in user's information and current roles. -```bash -curl -X GET "http://localhost:3200/auth/me" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` +Returns `{accessToken, tokenType: "bearer", user}` and sets `mansa_token`. Creates a new DB session per login (no session reuse). ### Logout -Logs out the user and revokes the current session. + ```bash curl -X POST "http://localhost:3200/auth/logout" \ -H "Authorization: Bearer YOUR_TOKEN" ``` -**Response Behavior:** -- Revokes the current session in the database. -- Deletes the authentication cookie. + +Revokes the token's DB session (best-effort) and deletes the cookie. Always returns success even with no/invalid token. ### Google OAuth2 Login -Initiates the Google authentication flow. -**With custom redirect URL:** ```bash -# Redirect your browser to: -GET http://localhost:3200/auth/google?redirect_url=http://127.0.0.1:5500/main/test/auth.html +# Browser redirect; redirect_url optional, else Referer header is used: +GET http://localhost:3200/auth/google?redirect_url=http://localhost:5500/main/test/auth.html ``` -**Without redirect_url (uses Referer header):** -```bash -GET http://localhost:3200/auth/google -``` +Passes `redirect_url` as the OAuth `state` param (`:166`). + +### Google Callback (cookie-only) + +Internal endpoint. Flow (`:173-222`): + +1. Patches the `sso_state` cookie from the `state` query param (`:177-180`) as a SameSite workaround. +2. `verify_and_process`, syncs/creates the local user by Google id. +3. **Cookie-only redirect — no `?token=` in the URL.** If `state` is an `http(s)` URL whose host is in `LOCALHOST_ADDRESSES` or ends with `.localhost` (`:207-213`), returns `303 RedirectResponse` to it with the session cookie set (`:215-218`). +4. Otherwise (non-localhost or missing state) returns JSON `{accessToken, tokenType: "bearer", user}` with the cookie set (`:220-222`). + +## Security features -### Google Callback -Internal endpoint handled by the server. After successful Google login, it: -1. Verifies the user with Google using fastapi-sso. -2. Synchronizes the user with the local MySQL database. -3. Creates a session with device information. -4. Redirects to the frontend with the token in the URL query parameter: - - Format: `http://127.0.0.1:5500/main/test/auth.html?token=ACCESS_TOKEN` - - The token is also set as an HttpOnly cookie (`mansa_token`) - -## Security Features - -- **Bcrypt Hashing**: All passwords are salted and hashed using the Blowfish algorithm (bcrypt). -- **Auto-increment Gap Prevention**: The registration flow performs pre-insertion checks for existing usernames/emails to prevent database ID gaps on failed attempts. -- **Stateless Authentication**: JWT allows the server to verify users without session storage. -- **Hybrid Session Management**: JWT tokens include session IDs for tracking and revocation capabilities. -- **Device Detection**: Sessions include device fingerprinting (browser, OS, IP). -- **Session Revocation**: Users can revoke individual sessions or all sessions at once. -- **CORS Protection**: Configured with dynamic origin matching to allow authenticated requests from trusted frontends while maintaining security. -- **fastapi-sso**: OAuth2 flow handled by fastapi-sso library with built-in CSRF protection via state parameter. -- **OAuth State Parameter**: Redirect URL is passed via OAuth state parameter, not stored in session (avoids SameSite cookie issues). -- **HttpOnly Cookies**: Authentication tokens stored in HttpOnly cookies to prevent XSS attacks. - -## Device Detection - -The system automatically detects and stores device information for each session: - -| Field | Description | -|-------|------------| -| browser | Detected browser (Chrome, Firefox, Safari, etc.) | -| browserVersion | Browser version | -| os | Operating system (Windows, macOS, Linux, Android, iOS) | -| osVersion | OS version | -| deviceType | Device category (desktop, mobile, tablet) | -| ipAddress | Client IP address | -| userAgent | Raw user agent string | - -## Session Management - -Sessions are tracked in the database and provide: -- **Device Fingerprinting**: Unique identifier based on User-Agent + IP -- **Session Listing**: View all active sessions -- **Session Revocation**: Revoke individual or all sessions -- **Automatic Expiration**: Sessions expire with JWT (24 hours) - -See [User Documentation](user.md#session-management) for session management endpoints. +- **Bcrypt hashing** (`util.py:14-28`) with empty-password guards. +- **Pre-insertion duplicate checks** on register to avoid id gaps. +- **Hybrid sessions**: stateless JWT carrying `sessionId`, revocable via DB row (`isActive` flag). +- **Conditional `Secure` cookies** (HTTPS-aware, proxy-aware). +- **OAuth state allowlist**: only localhost hosts accepted for redirect; anything else falls back to JSON (open-redirect guard). +- **CORS**: dynamic origin matching for trusted frontends. + +## Not implemented + +Password recovery, 2FA, and profile editing do not exist. The only user-surface reads are `GET /user/me`, `GET /user/admin`, and the `/user/sessions*` family (see `docs/user.md`). ## Workflow ```mermaid graph TD User["User Interface"] --> Start{Login Method?} - + Start -- Standard --> Login["POST /auth/login"] Login --> Verify["Verify Bcrypt Hash"] - Verify -- Success --> CreateSession["Create Session in DB"] - CreateSession --> JWT["Generate JWT with sessionId"] - + Verify -- Success --> CreateSession["Create Session in DB (30d expiry)"] + CreateSession --> JWT["Generate HS256 JWT with sessionId"] + Start -- Google OAuth --> GLogin["GET /auth/google?redirect_url=URL"] - GLogin --> State["Store redirect URL in state param"] + GLogin --> State["Pass redirect URL as OAuth state"] State --> GRedirect["Redirect to Google"] GRedirect --> GAuth["User authenticates with Google"] GAuth --> GCallback["GET /auth/callback"] - GCallback --> GVerify["Verify and process token"] - GVerify --> GSync["Sync User in MySQL"] - GSync --> GCreateSession["Create Session in DB"] - GCreateSession --> OAuthJWT["Generate JWT with sessionId"] - - Start -- Register --> Reg["POST /auth/register"] + GCallback --> Allowlist{"state host local?"} + Allowlist -- Yes --> CookieRedirect["303 redirect + cookie (no ?token=)"] + Allowlist -- No --> JSONFallback["JSON accessToken + cookie"] + + Start -- Register --> Reg["POST /auth/register (10/min)"] Reg --> Valid["Check Duplicate User"] Valid -- OK --> Hash["Hash Password"] Hash --> Save["Save to MySQL"] Save --> CreateSession - JWT --> Cookie["Set HttpOnly Cookie & Redirect"] - OAuthJWT --> Cookie - + JWT --> Cookie["Set HttpOnly conditional-Secure Cookie"] Cookie --> Home["Access Granted"] ``` ## License -Mansa Team's MODIFIED GPL 3.0 License. See LICENSE for details. \ No newline at end of file +Mansa Team's MODIFIED GPL 3.0 License. See LICENSE for details. diff --git a/docs/orunmila.md b/docs/orunmila.md new file mode 100644 index 0000000..8d571ee --- /dev/null +++ b/docs/orunmila.md @@ -0,0 +1,91 @@ +# Orunmila + +O Orunmila é um agente chatbot focado no domínio financeiro, com acesso à carteira do usuário (sistema de carteira Iyagba/Thoth, em desenvolvimento), a dados financeiros (Stocks API) e a um sandbox para análises de computação estatística (ForgeVM), com um poderoso sistema de memória. Ele é a proposta de renomeação do Prometheus. + +> Nota: os identificadores de código (env `PROMETHEUS_*`, rotas `/prometheus/*`, tabelas `prometheus`) permanecem inalterados até a renomeação posterior do código. + +## Usage + +1. Environment configuration (`.env`) — `PrometheusSettings` (`config.py:59-71`): + + ```env + PROMETHEUS_ENABLED=TRUE + PROMETHEUS_HOST=localhost + PROMETHEUS_PORT=3200 + GEMINI_API.KEY=your_api_key_here + SEARXNG_URL=http://searxng:8888 + FORGEVM_URL=http://forgevm:7423 + FORGEVM_API_TOKEN= + SANDBOX_IMAGE=sandbox-python:latest + SANDBOX_MEMORY=512 + SANDBOX_CPU=1 + SANDBOX_TTL=5 + WORKSPACE_MAX_UPLOAD_MB=10 + ``` + +2. Database Schema: + + `prometheus` (`main/models/prometheus.py:7-16`): + + * `sessionId`: String(255) (PK) + * `userId`: Integer (FK → users.userId, ondelete CASCADE) + * `title`: String(255) + * `summary`: Text (nullable, technical memory) + * `history`: JSON (default `[]`, array of `{role, content, timestamp, metadata}`) + * `lastActivity`: TIMESTAMP (server_default now, onupdate now) + * `createdAt`: TIMESTAMP (server_default now) + + `prometheus_memories` (`main/models/memory.py:8-34`): + + * `id`: Integer (PK, autoincrement) + * `userId`: Integer (indexed) + * `memoryKey`: String(100) + * `memoryValue`: Text + * `memoryType`: String(20), default `"context"` + * `source`: String(20), default `"inferred"` + * `score`: Float, default `1.0` + * `accessCount`: Integer, default `0` + * `embedding`: Vector(384) + * `contentHash`: String(32) + * `createdAt` / `updatedAt`: DateTime (server_default now; `updatedAt` onupdate now) + * `lastAccessedAt` / `archivedAt`: DateTime (nullable) + * Constraints: `UniqueConstraint(userId, memoryKey)` (`uk_prometheus_memories`), indexes `idx_relevance(userId, score)` and `idx_type(userId, memoryType)` + +3. Run the server: + + ```bash + python run.py + ``` + +## Workflow + +30-turn Gemini-native tool-calling loop (`main/app/prometheus/agent.py:52,316,370`): + +* `MAX_TURNS = 30` (`agent.py:52`); main loop `while turn < MAX_TURNS` (`agent.py:316`). +* Each turn: stream Gemini chunks → collect `function_calls` → `dispatchToolCall` (MCP sessions + local `TOOL_REGISTRY`) → append tool results → re-send conversation until a text-only turn or `turn_limit`. +* Hitting the cap yields `{"type": "turn_limit", "maxTurns": 30}`. +* Model: `gemini-flash-lite-latest`; chat temperature `0.5` (`agent.py:245,250`), memory extraction temperature `0.2` (`main/app/prometheus/memory.py:493,497`). +* `TOOL_REGISTRY` — 7 tools (`main/app/prometheus/tools.py:179-187`): `search_memory`, `save_memory`, `execute_code`, `read_file`, `write_file`, `list_files`, `serve_file`. +* ForgeVM sandbox per chat turn (`main/app/prometheus/sandbox.py:24-66`): `spawn(image, memory_mb, vcpus, ttl)` from `PROMETHEUS_*` settings; per-user workspace under `/workspace/{userId}` with path-traversal guard (`hostPath`). +* Streaming over SSE via `sse_starlette` (`main/app/prometheus/stream_bus.py:6,109`): `JSONServerSentEvent` generator + `EventSourceResponse(..., ping=15)`. +* Memory (`main/app/prometheus/memory.py`): fused rank `0.6 * vector + 0.25 * fulltext + 0.15 * recency` (`:173`); caps 50 basic / 250 premium (`:72-73`); `rapidfuzz` dedup (`:134`); `cashews` cache matrix (`:30`); deferred BLOB embedding load (`:304`). +* Compaction (`main/app/prometheus/compact.py:20-21`): episode token budget `8000`, episode cap `12`. + +## API Endpoints + +Router prefix `/prometheus` (`main/controller/prometheus_controller.py`): + +* `GET /prometheus/health` — liveness (`:31`). +* `GET /prometheus/sessions` — list user sessions, default `limit=20` (`:36`). +* `PUT /prometheus/sessions/{sessionId}` — rename (`:55`). +* `GET /prometheus/history/{sessionId}` — ownership-protected history (`:70`). +* `DELETE /prometheus/sessions/{sessionId}` — delete (`:89`). +* `POST /prometheus/chat/stream` — start SSE run, 5/min (`:101`). +* `GET /prometheus/chat/stream/{sessionId}` — resume SSE run (`:153`). +* `DELETE /prometheus/workspace/delete` — delete file, 30/min (`:164`). +* `GET /prometheus/workspace/download?path=` — download file (`:178`). +* `GET /prometheus/workspace/list?path=/workspace` — list files (`:194`). + +## License + +Mansa Team's MODIFIED GPL 3.0 License. See LICENSE for details. diff --git a/docs/prometheus.md b/docs/prometheus.md deleted file mode 100644 index bef1832..0000000 --- a/docs/prometheus.md +++ /dev/null @@ -1,75 +0,0 @@ -# Prometheus - -O Prometheus é um ecossistema de conversação imersivo, projetado para atuar como um analista de investimentos inteligente e confiável. Ele utiliza técnicas avançadas de Geração Aumentada por Recuperação (RAG), conectando-se diretamente à Mansa's Stocks API para extrair dados fundamentalistas atualizados. Diferente de um chatbot comum, o Prometheus segue um fluxo de trabalho rigoroso de quatro estágios para garantir que as respostas não sejam apenas precisas, mas também baseadas em conclusões técnicas e persistentes. - -A inteligência do sistema é movida pelo modelo Gemini 3.1 Flash Lite e Gemma 4 31B, mas o seu grande diferencial reside na nossa Arquitetura de Memória e Persistência. O ciclo de interação começa no Stage 0, onde o sistema injeta um resumo técnico das conclusões de sessões anteriores diretamente no prompt. Isso garante que a IA nunca "esqueça" o raciocínio financeiro desenvolvido com o usuário ao longo do tempo. No Stage 1, a linguagem natural do usuário é convertida em chamadas de API estruturadas, capazes de lidar com rankings deduplicados e ajustes temporais automáticos, garantindo que a análise reflita sempre o último ano fiscal completo. - -Após o processamento dos dados e a análise de negócios (que inclui a avaliação de Moats e Valuation), o sistema encerra a interação no Stage 4. Nesta fase, o Prometheus realiza uma auto-manutenção da sessão: ele atualiza o título da conversa para algo conciso e gera um novo resumo técnico comprimido. Esse processo de sumarização automática é vital para preservar o contexto dentro dos limites de tokens do modelo, mantendo a alta performance e a continuidade do suporte decisório para o investidor. Tudo isso opera sob uma camada de segurança robusta, onde o acesso é protegido por regras de controle de acesso baseadas em funções (RBAC) e o histórico é armazenado em formato JSONB para máxima eficiência. - -## Usage -1. Environment configuration (`.env`): - ```env - # - #$ DATABASE CONFIGURATION - # - USER_MYSQL_USER=user - USER_MYSQL_PASSWORD=password - USER_MYSQL_HOST=localhost - USER_MYSQL_DATABASE=database - - # - #$ STOCKS API - # - STOCKSAPI_HOST=localhost - STOCKSAPI_PORT=3200 - STOCKSAPI_PRIVATE.KEY=your_api_key_here - - # - #$ PROMETHEUS - # - PROMETHEUS_ENABLED=TRUE - - PROMETHEUS_HOST=localhost - PROMETHEUS_PORT=3201 - - PROMETHEUS_KEY.SYSTEM=TRUE - PROMETHEUS_PRIVATE.KEY=your_api_key_here - - GEMINI_API.KEY=your_api_key_here - ``` - -2. Database Schema: - The `prometheus` table should have the following structure: - * `sessionId`: String (PK) - * `userId`: Integer (FK to users) - * `title`: String (Max 255 chars) - * `summary`: Text (Technical Memory) - * `history`: JSON (Array of `{role, content, timestamp, metadata}`) - * `lastActivity`: Timestamp - -3. Run the server: - ```bash - python __init__.py - ``` - -## Workflow - -```mermaid -graph TD - A["User Input"] --> S0["Stage 0: Memory Retrieval
(Load Summary)"] - S0 --> B["Stage 1: Intent & Ranking Parser"] - B --> C["Stage 2: Manson Stocks API
(Deduplicated Ranked Data)"] - C --> G["Stage 3: Advanced Business Analysis
(Moat, Valuation, Multi-Charts)"] - G --> S4["Stage 4: Memory Compression
(Update Summary & Title)"] - S4 --> K["Final UI/UX Response"] -``` - -## API Endpoints -* `GET /prometheus/sessions`: List last 30 active sessions. -* `POST /prometheus/sessions`: Create session. -* `PUT /prometheus/sessions/{sessionId}`: Update session title (Rename). -* `GET /prometheus/history/{sessionId}`: Retrieve ownership-protected history. -* `POST /prometheus/chat`: Orchestrated workflow with memory persistence. - -## License -Mansa Team's MODIFIED GPL 3.0 License. See LICENSE for details. \ No newline at end of file diff --git a/docs/scraper_b3.md b/docs/scraper_b3.md index cc2456d..7b03d1a 100644 --- a/docs/scraper_b3.md +++ b/docs/scraper_b3.md @@ -1,133 +1,47 @@ -# Brazilian Stocks Market Scraper +# B3 Market Scraper -A high-performance Python scraper to collect, process, and store Brazilian stock market (B3) data from StatusInvest and TradingView. Built for research and API data for the Mansa project. +Collects, enriches, and stores Brazilian stock (B3) data. Entry: `main/app/scraper_b3/scraper.py` (`B3Scraper.scrapeStocks()`); scheduling lives in `main/service/scraper_service.py` (no separate scheduler module). -## Usage +## Sources (6) -1. Environment configuration (`.env`): - ```env - # - #$ DATABASE - # - STOCKS_MYSQL_USER=user - STOCKS_MYSQL_PASSWORD=password - STOCKS_MYSQL_HOST=host - STOCKS_MYSQL_DATABASE=database +| # | Source | Code | What it feeds | +|---|--------|------|---------------| +| 1 | StatusInvest advanced search + per-ticker page | `scraper.py:getInitialData`, `tagAlong` | Base universe (TICKER/NOME/SETOR/SUBSETOR/SEGMENTO/PRECO/P/L/P/VP/ROE/...) + TAG ALONG | +| 2 | TradingView scanner (`BMFBOVESPA:`) | `scraper.py:historicalRentability` | RENT 5 ANOS and perf windows | +| 3 | Investidor10 `cotacao-lucro//adjusted` | `scraper.py:216` (`historicalCotationProfits`) | Yearly COTACAO + LUCRO LIQUIDO | +| 4 | Investidor10 `cotacoes/acao/chart//3650//real` | `scraper.py:241` (`historicalCotations`) | COTACAO 10Y PADRAO (`false`) + COTACAO 10Y AJUSTADA (`true`) | +| 5 | Oceans14 fallback (`gHistoricoCotacaoLucro.aspx?papel=`) | `scraper.py:228` (`historicalCotationProfits_Oceans14`) | Same yearly COTACAO + LUCRO LIQUIDO when Investidor10 fails | +| 6 | Google News RSS (`news.google.com/rss/search?q=&hl=pt-BR`) | `scraper.py:283` (`stockNews`) | NOTICIAS (TITULO/LINK/DATE/SOURCE) | +| + | BCB SGS 4189 (SELIC) | `scraper.py:32` (`getCurrentSelic`) | `valor` + `valor medio 10y` (120-month rolling mean), used to scale XANGO growth threshold | - # - #$ SCRAPER - # - SCRAPER_ENABLED=TRUE - SCRAPER_SCHEDULER=18:30 - JSON_EXPORT=FALSE - MYSQL_EXPORT=TRUE - MAX_WORKERS=40 - ``` +Per-ticker fan-out is in `processTicker` (TradingView, dividends, yields, revenue, both profit sources, cotations, tag-along, news), then `fundamentalIndicators`. -## Output Format +## Scheduling & config (`config.py:77-81`, `scraper_service.py:23-36`) -### MySQL Table (b3_stocks) - -| Column Type | Description | -|------------|-------------| -| Metadata | TICKER, NOME, SETOR, SUBSETOR, SEGMENTO | -| Current | PRECO, DY, P/L, ROE, etc. | -| Historical | LUCRO LIQUIDO 2024, DIVIDENDOS 2023, etc. | -| Special | COTACAO 10Y PADRAO, HISTORICO DIVIDENDOS | - -### Sample Record - -```json -{ - "TICKER": "PETR4", - "NOME": "Petróleo Brasileiro S.A.", - "SETOR": "Petróleo, Gás e Biocombustíveis", - "PRECO": 34.21, - "DY": 8.73, - "P/L": 7.5, - "ROE": 0.18, - "CAGR LUCROS 10 ANOS": 15.4, - "INVESTING SCORE": 8.5, - "TIME": "2024-12-09 14:30:00" -} +```env +SCRAPER_ENABLED=FALSE # default False +SCRAPER_SCHEDULER= # default empty = no jobs; `;`-separated HH:MM list, e.g. "09:00;18:30" +JSON_EXPORT=FALSE # default False +MYSQL_EXPORT=TRUE # default True +MAX_WORKERS=10 # default 10 (40 is just an example override, not the default) ``` -## Xangô - -Mansa's own stock scoring algorithm for the Brazilian Stock Market focuses on the fundamental principles Mansa uses to evaluate stocks. It addresses the Growth-Volatility Paradox to select stocks with concise, consistent profit growth, grading them based on their ability to generate and grow profits over time using mathematical methods. - - -### Global Score Function - -$$f(P, L, c) = \min(100, \max(0, \Phi(P) \cdot \Omega(P) \cdot \Lambda(L, c) \cdot M_{profit}(P)))$$ - -Where: -- $P$: 10-year profit vector $\{p_1, p_2, \dots, p_{10}\}$ -- $L$: Average daily liquidity (R$) -- $c$: Ticker class (3 = common shares, other = preferred/unit) - -### Engines - -#### Profit Quality Gate ($M_{profit}$) -Penalizes stocks with any negative annual profit: -$$M_{profit}(P) = \begin{cases} \alpha_{profit} & \text{if } \exists p_t \leq 0 \\ 1.0 & \text{otherwise} \end{cases}$$ -Default: $\alpha_{profit} = 0.5$ - -#### Fundamental Engine ($\Phi$) -Evaluates intrinsic velocity with size-bias elimination: -$$\Phi(P) = \omega_{growth} \cdot S_{growth}(P) + (1 - \omega_{growth}) \cdot S_{cons}(P)$$ - -- **Relative Growth** ($S_{growth}$): OLS slope normalized by mean profit, capped at threshold: - $$S_{growth}(P) = \min\left(100, \max\left(0, \frac{\max(\beta / \mu_p, e^{\hat{\beta}} - 1)}{T_{growth}} \cdot 100\right)\right)$$ - Default: $T_{growth} = 0.07$ (7%) - -- **Consistency** ($S_{cons}$): Weighted reliability metric: - $$S_{cons}(P) = 60 \cdot \left(\frac{1}{n} \sum \mathbf{1}_{\{p_t > 0\}}\right) + 40 \cdot \left(\frac{1}{n-1} \sum \mathbf{1}_{\{p_t > p_{t-1}\}}\right)$$ - -Default: $\omega_{growth} = 0.75$ - -#### Risk-Quality Engine ($\Omega$) -Measures "Trend Adherence" using CV-RMSE: -$$\Omega(P) = M_{vol}(P) \cdot M_{DD}(P)$$ - -- **Volatility Multiplier** ($M_{vol}$): Penalizes residuals from linear trend only: - $$M_{vol}(P) = \max\left(F_{vol}, 1 - 2 \cdot \max\left(0, \frac{RMSE}{\mu_p} - T_{cv}\right)\right)$$ - Defaults: $T_{cv} = 0.16$, $F_{vol} = 0.40$ - -- **Drawdown** ($M_{DD}$): Recovery-aware forgiveness: - $$M_{DD}(P) = \max\left(F_{dd}, 1 - \hat{DD}_{effective}\right)$$ - Defaults: $F_{dd} = 0.60$, $T_{recovery} = 0.45$ - -#### Constraint Engine ($\Lambda$) -Ensures theoretical alpha can be realized: -$$\Lambda(L, c) = M_{liq}(L) \cdot M_{class}(c)$$ - -- **Liquidity** ($M_{liq}$): Square-root decay for low liquidity: - $$M_{liq}(L) = \begin{cases} 1.0 & \text{if } L \geq T_{liq} \\ \max\left(F_{liq}, \sqrt{L/T_{liq}}\right) & \text{otherwise} \end{cases}$$ - Defaults: $T_{liq} = 10,000,000$, $F_{liq} = 0.5$ +`registerScraperJobs()` splits `SCRAPER_SCHEDULER` on `;`, parses each as `HH:MM`, and registers `runScraper` with APScheduler `CronTrigger(hour, minute)` (`scraper_0`, `scraper_1`, ...). Invalid entries log a warning. `ScraperService.initialize()` calls it at boot; `runScraper()` builds `B3Scraper()` and calls `scrapeStocks()`. -- **Class** ($M_{class}$): Governance factor for B3 tickers: - $$M_{class}(c) = \begin{cases} 1.0 & \text{if } c = 3 \\ \alpha_{class} & \text{otherwise} \end{cases}$$ - Default: $\alpha_{class} = 0.75$ +## XANGO score (`main/app/scraper_b3/xango.py`) -### Configuration Parameters +Params (`xango.py:5-8`): `CONSISTENCY_WEIGHT=0.85`, `GROWTH_WEIGHT=0.75` (applied to growth term), `GROWTH_K=4`, `GROWTH_THRESHOLD_BASELINE=0.10`, 10y SELIC mean (`xango.py:39`). -| Parameter | Default | Description | -|-----------|---------|-------------| -| `MIN_YEARS` | 10 | Minimum years of data | -| `GROWTH_WEIGHT` | 0.75 | Weight for growth vs consistency | -| `GROWTH_THRESHOLD` | 0.07 | Growth threshold (7%) | -| `VOLATILITY_THRESHOLD` | 0.16 | CV-RMSE threshold | -| `VOLATILITY_FLOOR` | 0.40 | Minimum volatility multiplier | -| `RECOVERY_THRESHOLD` | 0.45 | Recovery ratio for full forgiveness | -| `DRAWDOWN_FLOOR` | 0.60 | Minimum drawdown multiplier | -| `LIQUIDITY_THRESHOLD` | 10,000,000 | Minimum daily liquidity (R$) | -| `LIQUIDITY_FLOOR` | 0.5 | Minimum liquidity multiplier | -| `PROFIT_PENALTY` | 0.5 | Penalty for negative profit years | -| `CLASS_PENALTY` | 0.75 | Multiplier for non-common shares | +- Growth threshold is SELIC-scaled: `growthThreshold = 0.10 * (selicBaseline / selicRate)` (`xango.py:45`). +- Growth is tanh-shaped (`xango.py:57`): `growth = 50 * (tanh(4 * (raw - T)) + 1)` where `raw = slope/mean` (OLS slope over 10y LUCRO LIQUIDO / mean). +- Base (`xango.py:85-89`): `Φ = growth * 0.75 + consistency * 0.85`, then `+20%` eligibility bonus: `base *= 1 + 0.20 * g_elig * c_elig` with `g_elig = 0.5*(tanh((growth-50)/5)+1)`, `c_elig = 0.5*(tanh((consistency-80)/3)+1)`. +- Liquidity uses prefix-sum (`scraper.py:395-396`, `xango.py:93`): `totalLiq = sum(LIQUIDEZ MEDIA DIARIA for tickers sharing first 4 letters)`; `mLiq` = sqrt decay below R$10M. +- Output (`scraper.py:410-413`): `XANGO INVESTING SCORE` + `XANGO M_VOL` / `XANGO M_DD` / `XANGO CONSISTENCY` / `XANGO GROWTH`. ---- +## Outputs -## License +JSON columns (`scraper.py:22`): `COTACAO 10Y PADRAO`, `COTACAO 10Y AJUSTADA`, `HISTORICO DIVIDENDOS`, `NOTICIAS`. +Derived indicators (`scraper.py:296-375`): `EBIT` (MARGEM EBIT x RECEITA), `DY MEDIO 5 ANOS`, `RENT MEDIA 5 ANOS`, `LUCRO LIQUIDO MEDIO 5 ANOS`, `CAGR DIVIDENDOS 5 ANOS`, `CAGR LUCROS 10 ANOS`, `SGR` (ROE x retention), `PRECO DE GRAHAM` (sqrt(22.5 x LPA x VPA)), `PRECO DE BAZIN` (avg 5y DIV / 0.06), plus XANGO columns above. +MySQL (`scraper.py:533-660`, table `b3_stocks`): `exportMysql` appends rows (`if_exists="append"`), `ALTER TABLE ... ADD COLUMN` for new columns (JSON vs TEXT vs DOUBLE), forces `LONGTEXT` on JSON columns, then backfills metadata (NOME/SETOR/SUBSETOR/SEGMENTO from latest non-null per ticker) and historical yearly columns (RECEITA/LUCRO/DIVIDENDOS/DY/MARGEM*/DESPESAS/COTACAO) from the previous non-null row per ticker. -Mansa Team's MODIFIED GPL 3.0 License. See LICENSE for details. +Concurrency: `ThreadPoolExecutor(max_workers=Config.SCRAPER.MAX_WORKERS)` (`scraper.py:450-458`). diff --git a/docs/stocks_api.md b/docs/stocks_api.md index 47570a9..5bd1aef 100644 --- a/docs/stocks_api.md +++ b/docs/stocks_api.md @@ -1,114 +1,128 @@ # Brazilian Stocks Market API -A comprehensive API for accessing 40+ fundamental data points from the Brazilian Stock Market, featuring an API Key system for secure access and optimal performance. +API for Brazilian B3 stocks: year-based historicals, point-in-time fundamentals, 10-year daily cotations, and live B3 quotes. Built for the [Mansa](https://github.com/mansa-team) project and RAG integration. -Built for the [Mansa](https://github.com/mansa-team) project and designed for integration with Retrieval-Augmented Generation (RAG) systems. +Call `GET /stocks/fields` first — field names are dynamic. Never guess them. ## Usage -1. Environment configuration (`.env`): - ```env - # - #$ DATABASE CONFIGURATION - # - USER_MYSQL_USER=user - USER_MYSQL_PASSWORD=password - USER_MYSQL_HOST=localhost - USER_MYSQL_DATABASE=database - - # - #$ STOCKS API - # - STOCKSAPI_ENABLED=TRUE - STOCKSAPI_HOST=localhost - STOCKSAPI_PORT=3200 - - STOCKSAPI_KEY.SYSTEM=TRUE - STOCKSAPI_PRIVATE.KEY=your_api_key_here - - STOCKSAPI_DEFAULT.QUOTA=5000 - STOCKSAPI_QUOTA.RESETDAYS=30 - ``` + +Environment configuration (`.env`): + +```env +STOCKSAPI_ENABLED=TRUE +STOCKSAPI_HOST=localhost +STOCKSAPI_PORT=3200 + +STOCKSAPI_KEY.SYSTEM=FALSE +STOCKSAPI_PRIVATE.KEY=your_api_key_here +``` + +`KEY_SYSTEM` defaults to `False` (config.py:54). There are no `DEFAULT_QUOTA` / `RESETDAYS` vars. Quota is per-key: `requestLimit=100`, `currentUsage` (models/stocksapi_key.py:15). + +## Auth + +All data endpoints depend on `verifyAPIKey` (main/app/stocks_api/key.py:17) reading the `X-API-Key` header: + +- `KEY_SYSTEM=false` → auth bypassed, dependency returns `None`. +- `KEY_SYSTEM=true` → missing key = `401`; unknown hash = `401`; usage over limit = `429`. +- Quota increment is one atomic `UPDATE ... WHERE currentUsage < requestLimit` (key.py:27-32); `rowcount == 0` decides 401 vs 429. ## API Endpoints ### Health Check + ```bash curl http://localhost:3200/stocks/health ``` -Returns service status and timestamp. -### API Key Verification -```bash -curl -H "X-API-Key: YOUR_KEY" http://localhost:3200/stocks/key -``` +Returns `status`, `service`, `cacheReady`, `cacheUpdatedAt`, `cacheAgeHours`. + +### Field Discovery -### Key Management -Users can generate or refresh their API Key. Each user is limited to one active key at a time. Generating a new key will automatically deactivate the previous one but maintain the current usage statistics. ```bash -curl "http://localhost:3200/stocks/key/generate?userId=1" +curl http://localhost:3200/stocks/fields ``` -**Parameters:** -- `userId`: The unique identifier for the user. + +Returns `historical` (field → years), `fundamental` (columns), `abbreviations`, `nested`. Returns `503` when the cache is not initialized (controller:72-73). No auth required. ### Historical Data -Query financial metrics across multiple years: + ```bash -curl -H "X-API-Key: YOUR_KEY" "http://localhost:3200/stocks/historical?search=PETR4&fields=DY,LUCRO%20LIQUIDO&dates=2020,2024&orderBy=LUCRO%20LIQUIDO&limit=5" +curl -H "X-API-Key: YOUR_KEY" "http://localhost:3200/stocks/historical?search=PETR4&fields=LUCRO%20LIQUIDO&dates=2022,2024&orderBy=LUCRO%20LIQUIDO&limit=5" ``` -**Parameters:** -- `search`: Ticker symbol or company name. -- `fields`: Comma-separated field names. -- `dates`: Single year or range (e.g., `2020` or `2020,2024`). -- `orderBy`: Field to sort the results by (Descending). -- `limit`: Maximum number of records to return. - -**Deduplication:** -Both `fundamental` and `historical` endpoints now support `orderBy` and `limit`. Specifically for `historical`, if multiple records exist for the same ticker within the date range, the system will prioritize the first one after sorting. -``` -DESPESAS, DIVIDENDOS, DY, LUCRO LIQUIDO, MARGEM BRUTA, MARGEM EBIT, MARGEM EBITDA, MARGEM LIQUIDA, RECEITA LIQUIDA, COTACAO -``` +- `search`: tickers only — regex `^[A-Za-z0-9,\s]*$` (controller:87), so no company-name free text. Case-insensitive, comma-separated, prefix match (`PET` matches `PETR4`, `PETR3`; query.py:153-168). +- `fields`: historical metric names WITHOUT year suffix; validated against `/fields`, invalid = `400`. +- `dates`: year-only. `2024` = that year; `2022,2024` = inclusive range. Full dates parse but only the year is used (query.py:195-200). +- Empty request (no `search`/`fields`/`dates`) → `400` (query.py:179-180). +- Columns come back as `"FIELD YEAR"` (e.g. `LUCRO LIQUIDO 2024`); rows deduped per ticker. +- Cache TTL `1h`, `Cache-Control: public, max-age=300` (controller:84,141). ### Fundamental Data -Query current valuations and metrics by date range: + ```bash -curl -H "X-API-Key: YOUR_KEY" "http://localhost:3200/stocks/fundamental?search=VALE3&fields=ROE,P/L,PRECO&dates=2024-01-01,2024-12-31&orderBy=ROE&limit=10" +curl -H "X-API-Key: YOUR_KEY" "http://localhost:3200/stocks/fundamental?search=VALE3&fields=ROE,P/L&dates=2024-06&orderBy=ROE&limit=10" ``` -**Parameters:** -- `search`: Ticker symbol or company name (Empty for global search/ranking). -- `fields`: Comma-separated field names. -- `dates`: Single date or range (supports YYYY, YYYY-MM, or YYYY-MM-DD formats). -- `orderBy`: Field to sort the results by (Descending). -- `limit`: Maximum number of records to return. -When `search` is empty, the API automatically removes duplicate tickers, returning only the most recent entry for each stock based on the `orderBy` criteria. This is ideal for market rankings. +- `search`: same tickers-only regex + prefix match as historical. Empty/blank search dedups to one row per ticker (`drop_duplicates TICKER`, query.py:280-281). +- `fields`: point-in-time names, no year suffix. Cotation columns (`COTACAO 10Y PADRAO/AJUSTADA`) are excluded even if requested (query.py:245-256). +- `dates`: `YYYY` → last snapshot of the year; `YYYY-MM` → last of the month; `YYYY-MM-DD` → closest single snapshot per ticker (min-abs-diff grouping, query.py:262-275); `START,END` → range filter. Unparseable = `400`. +- Empty request (no `search`/`fields`/`dates`) → `400`. +- `TIME` normalized to `YYYY-MM-DD` (query.py:116-117). +- Cache TTL `5m`, `Cache-Control: public, max-age=300` (controller:149,211). + +### Cotations (10-year daily history) +```bash +curl -H "X-API-Key: YOUR_KEY" "http://localhost:3200/stocks/cotations?search=PETR4,VALE3&dates=2023-01-01,2023-12-31" +curl -H "X-API-Key: YOUR_KEY" "http://localhost:3200/stocks/cotations?search=ITUB4&adjusted=true" ``` -NOME, TICKER, SETOR, SUBSETOR, SEGMENTO, SGR, TAG ALONG, INVESTING SCORE, PRECO, VALOR DE MERCADO, LIQUIDEZ MEDIA DIARIA, P/L, P/VP, P/ATIVOS, P/EBIT, P/CAP. GIRO, P. AT CIR. LIQ., PSR, EV/EBIT, PEG Ratio, PRECO DE GRAHAM, PRECO DE BAZIN, MARG. LIQUIDA, MARGEM BRUTA, MARGEM EBIT, ROE, ROA, ROIC, VPA, LPA, DY, DY MEDIO 5 ANOS, CAGR DIVIDENDOS 5 ANOS, CAGR RECEITAS 5 ANOS, CAGR LUCROS 5 ANOS, CAGR LUCROS 10 ANOS, CRESCIMENTO MEDIO LUCROS 10 ANOS, LUCRO LIQUIDO MEDIO 5 ANOS, RENT 1 DIA, RENT 5 DIAS, RENT 1 MES, RENT 6 MESES, RENT 1 ANO, RENT 12 MESES, RENT 5 ANOS, RENT MEDIA 5 ANOS, RENT TOTAL, PATRIMONIO / ATIVOS, PASSIVOS / ATIVOS, LIQ. CORRENTE, DIVIDA LIQUIDA / EBIT, DIV. LIQ. / PATRI., GIRO ATIVOS, COTACAO 10Y PADRAO, COTACAO 10Y AJUSTADA, HISTORICO DIVIDENDOS, NOTICIAS + +- `search` REQUIRED (min 1 char). Same ticker regex as above. +- `dates`: optional `YYYY-MM-DD,YYYY-MM-DD` filter on each `{DATA, PRECO}` entry; omitted = full 10-year series. +- `adjusted=false` → `COTACAO 10Y PADRAO` (nominal B3); `true` → `COTACAO 10Y AJUSTADA` (real returns). +- Sorted by `TIME` desc, deduped to latest row per ticker. +- Cache TTL `5m`, `Cache-Control: public, max-age=300` (controller:219,267). + +### Live Price + +```bash +curl -H "X-API-Key: YOUR_KEY" "http://localhost:3200/stocks/cotations/live?search=PETR4" ``` -## Response Format +- `search` REQUIRED, single ticker, `max_length=7` (controller:278). Exact ticker — no prefix matching. B3 market hours 10:00–17:30 BRT; off-hours returns last close. +- Response `type: realtime-cotation` with `PRECO ATUAL/ORIGINAL/MINIMO/MAXIMO/MEDIO` + `timestamp`. +- Unknown ticker → `404`; B3 fetch failure → `503`. Transient (timeout/connection/5xx) retried 3x (query.py:341-347). +- Cache TTL `15s`, `Cache-Control: public, max-age=15` (controller:275,312). -All successful responses follow this structure: +### MCP (AI agent tools) + +Mounted at `/stocks/mcp` via FastApiMCP (stocksapi_service.py:33-45) exposing 5 operations: `list_fields`, `get_historical`, `get_fundamental`, `get_cotations`, `get_live_price`. + +`MCPDetectMiddleware` (stocksapi_service.py:10-22): any request with `X-MCP: true` forces `compact=true`. `?compact=true` (or the header) returns the abbreviated form: meta/historical/fundamental abbreviations, nested subfield compression, cotation `h`/`d` column form, live `PA/PO/PMN/PMX/PMD` keys, single-row `data` unwrapped, `count/search/fields/dates/type` stripped (compress.py). + +## Response Format ```json { "search": "PETR4", "fields": ["P/L", "ROE"], - "dates": "2024", + "dates": "2024-06", "type": "fundamental", - "count": 250, - "data": [ - { - "TICKER": "PETR4", - "NOME": "Petróleo Brasileiro S.A.", - "TIME": "2024-11-15T10:30:00", - "P/L": 7.5, - "ROE": 0.18 - } - ] + "count": 1, + "data": [{ "TICKER": "PETR4", "NOME": "...", "TIME": "2024-06-28", "P/L": 7.5, "ROE": 0.18 }] } ``` +`503 "Cache not initialized"` whenever the feather cache isn't loaded — guarded by `snapshot()` (query.py:55-64) and `/fields`. + +## Architecture + +- **Cache build**: feather written in 2000-row streaming batches; lost DB connections retried 3x on `OperationalError` (cache.py:71-77). Cross-process `fcntl` build lock with no-op fallback (`tryBuildLock`, cache.py:263,168-182); build runs in a `subprocess` (`sys.executable -c ... buildFeatherCache()`, cache.py:270-277). Nested JSON columns keep a 20-row decompressed sample (cache.py:108-113). Frame sorted `TICKER` asc / `TIME` desc (cache.py:185-192). Refresh every 12h, stale threshold 6h with background rebuild (cache.py:36,220-226). +- **Abbreviations**: `generateAbbreviations` with `dedupAbbrev` (util.py:47-53), meta `TK/NM/TI`; nested fields auto-detected with URL subfields dropped in compact (`detectNestedFields`, util.py:96-130). +- **Compact wire form**: cotations → `{"h": "D,P", "d": [...]}` with `DD-MM` dates and `K/M/B/T` ints (compress.py:100-109); live → `PA/PO/PMN/PMX/PMD` (compress.py:11-16). +- **Transport/caching**: `GZipMiddleware(minimum_size=4096, compresslevel=3)` (service:31); endpoint cache is `cashews` over `mem://` (controller:17) with TTLs above; `/fields` fetch from Prometheus side also retried 3x on transient (compact.py:77). + ## License -Mansa Team's MODIFIED GPL 3.0 License. See LICENSE for details. \ No newline at end of file + +Mansa Team's MODIFIED GPL 3.0 License. See LICENSE for details. diff --git a/docs/user.md b/docs/user.md index 50b54ca..2e059d1 100644 --- a/docs/user.md +++ b/docs/user.md @@ -1,135 +1,107 @@ # User Management -Manage user profiles, role upgrades, and detailed user settings within the Mansa ecosystem. This module provides endpoints for users to view their own data, upgrade their status, and manage their sessions. +Profile reads, role checks, and session management for the Mansa ecosystem (`USER` service, prefix `/user`). All endpoints require auth via `UserManager.getCurrentUser` (token order `X-Access-Token` > `Bearer` > cookie — see `docs/authentication.md`). **No rate limits on any `/user/*` route** (no `@limiter` in `main/controller/user_controller.py`). -## Roles and Permissions +## Roles and permissions -The system uses a string-based multi-role system to control access. Users can have multiple roles simultaneously. +(`main/utils/roles.py:5-26` — note: there is **no** `DEVELOPER` role.) -| Role | Name | Description | -| :--- | :--- | :--- | -| **USER** | Standard | Default access to basic features (Thoth and Ma'at). | -| **PREMIUM** | Premium | Access to Prometheus and Ogum. | -| **DEVELOPER_STARTER** | Developer Starter | Access to developer tab and API Key generation. | -| **DEVELOPER_ENTERPRISE** | Developer Enterprise | Full API access, bulk exports, custom fields. | -| **ADMIN** | Admin | Full control over the system (includes all roles). | +| Role | Effective permissions | +| :--- | :--- | +| `USER` | none (`Permission.NONE`) — default on registration | +| `PREMIUM` | `USE_PROMETHEUS` + `PROMETHEUS_EXTENDED_MEMORIES` | +| `DEVELOPER_STARTER` | = `USER` (no extra permissions) | +| `DEVELOPER_ENTERPRISE` | = `DEVELOPER_STARTER` (no extra permissions) | +| `ADMIN` | all (`Permission.ALL()`), bypasses checks | + +Only two permissions exist: `USE_PROMETHEUS`, `PROMETHEUS_EXTENDED_MEMORIES`. There are no `VIEW_PROFILE` / `USE_THOTH` / `USE_MAAT` / `USE_OGUM` permissions — delete any such claims. There are no role-upgrade endpoints in code; any `upgrade/developer/*` docs are stale. -## API Endpoints +## API endpoints ### Health Check + ```bash curl http://localhost:3200/user/health ``` -Returns user service status. + +Returns user service status. No auth. ### Get Profile -Retrieve the currently authenticated user's information. -```bash -curl -H "Authorization: Bearer " http://localhost:3200/user/me -``` -**Response:** -```json -{ - "userId": 1, - "username": "john", - "email": "john@example.com", - "roles": ["USER"], - "sessionId": 5 -} -``` -### Upgrade to Developer Starter -Grants the `DEVELOPER_STARTER` role to the authenticated user. ```bash -curl -X POST -H "Authorization: Bearer " http://localhost:3200/user/upgrade/developer/starter +curl -H "Authorization: Bearer " http://localhost:3200/user/me ``` -### Upgrade to Developer Enterprise -Grants the `DEVELOPER_ENTERPRISE` role to the authenticated user. -```bash -curl -X POST -H "Authorization: Bearer " http://localhost:3200/user/upgrade/developer/enterprise -``` +Returns whatever `UserManager.getCurrentUser` yields (`{userId, username, email, roles, sessionId, ...}`). ### Admin Access -Test admin access (requires ADMIN role). + ```bash curl -H "Authorization: Bearer " http://localhost:3200/user/admin ``` -## Session Management +Returns `{message: "Admin access granted", user}` when `ADMIN` is in roles, else 403 `Admin access denied` (`main/controller/user_controller.py:38-43`). -Manage user authentication sessions, view active devices, and revoke sessions. +## Session management + +Sessions live **30 days** (`SESSION_EXPIRY_DAYS = 30`, `main/app/authentication/constants.py:3`). Each row stores **only** `sessionId`, `userId`, `accessTokenHash`, `deviceType`, `browser`, `operatingSystem`, `userAgent`, `isActive`, `createdAt`, `lastActivityAt`, `expiresAt` (`main/models/user_session.py:11-21`). Device fields are family-only (`None` when `user_agents` reports `Other`); there is **no** `browserVersion`, `osVersion`, `ipAddress`, `deviceName`, or fingerprint. `updateLastActive` (`main/app/authentication/session.py:117`) has zero callers — dead / not wired, so `lastActivityAt` never refreshes. + +Serialized shape (`sessionToDict`, `main/controller/user_controller.py:16-25`): `sessionId`, `deviceType`, `lastActiveAt`, `createdAt`, `isActive`, `isCurrent`, `userAgent`. No `browser`/`operatingSystem` keys are returned (they exist in DB but are not serialized). ### List All Sessions -View all active sessions for the current user. + +Paginated (`limit` default 20, max 100; `offset` default 0). Note: `limit`/`offset` apply in Python after fetching (up to 50 active rows via `getUserSessions`), not in SQL. + ```bash -curl -H "Authorization: Bearer " http://localhost:3200/user/sessions +curl -H "Authorization: Bearer " "http://localhost:3200/user/sessions?limit=20&offset=0" ``` -**Response:** + ```json { "sessions": [ { - "sessionId": 1, - "deviceName": "Chrome on Windows 11", - "browser": "Chrome", - "browserVersion": "135", - "os": "Windows", - "osVersion": "11", + "sessionId": "abc...", "deviceType": "desktop", - "ipAddress": "192.168.1.xxx", - "lastActiveAt": "2026-04-20T10:30:00", - "createdAt": "2026-04-20T10:00:00", + "lastActiveAt": "2026-04-20T10:30:00+00:00", + "createdAt": "2026-04-20T10:00:00+00:00", "isActive": true, - "isCurrent": false + "isCurrent": true, + "userAgent": "Mozilla/5.0 ..." } ], "total": 2, - "active": 2 + "active": 2, + "limit": 20, + "offset": 0 } ``` ### Get Current Session -Get details about the current active session. + +Most-recent active session by `lastActivityAt` (`getCurrentSession`). 404 `Current session not found` when none. + ```bash curl -H "Authorization: Bearer " http://localhost:3200/user/sessions/current ``` -**Response:** -```json -{ - "sessionId": 1, - "deviceName": "Chrome on Windows 11", - "browser": "Chrome", - "browserVersion": "135", - "os": "Windows", - "osVersion": "11", - "deviceType": "desktop", - "ipAddress": "192.168.1.100", - "userAgent": "Mozilla/5.0 ...", - "lastActiveAt": "2026-04-20T10:30:00", - "createdAt": "2026-04-20T10:00:00" -} -``` + +Same object shape as list items (no `browser`/`operatingSystem`/`ipAddress` fields). ### Revoke a Session -Revoke a specific session (logs out that device). + ```bash curl -X DELETE -H "Authorization: Bearer " http://localhost:3200/user/sessions/1 ``` -**Response:** -```json -{ - "message": "Session revoked successfully", - "sessionId": 1 -} -``` + +404 `Session not found` when the id is unknown or belongs to another user; else `{message: "Session revoked successfully", sessionId}`. ### Revoke All Sessions -Log out from all devices except the current one. + +Revokes **all** active sessions **including the current one** (`revokeAllSessions` has no exception for current). + ```bash curl -X POST -H "Authorization: Bearer " http://localhost:3200/user/sessions/revoke-all ``` -**Response:** + ```json { "message": "All sessions revoked successfully", @@ -137,21 +109,32 @@ curl -X POST -H "Authorization: Bearer " http://localhost:3200/user/sessi } ``` -## Permission System +## API keys (Stocks API) -Permissions are defined as bitmask flags: +One key per user. Table `stocksapi_keys` (`main/models/stocksapi_key.py:11-17`): `apiKey` (PK, `String(255)` — stores the **SHA-256 hex** of the key, never plaintext), `userId` (unique FK → `users.userId`, cascade delete), `requestLimit` (default 100), `currentUsage` (default 0), `lastReset`. -```python -Permission.VIEW_PROFILE # View own profile -Permission.USE_THOTH # Use wallet management -Permission.USE_MAAT # Use quantitative models -Permission.USE_PROMETHEUS # Use AI chat -Permission.USE_OGUM # Use auto-trading -``` +Verification (`main/app/stocks_api/key.py:17-48`): + +- Bypassed entirely (returns `None`) when `Config.STOCKS_API.KEY_SYSTEM` is falsy. +- Client sends the raw key in the `X-API-Key` header (`APIKeyHeader(name="X-API-Key", auto_error=False)`). +- Usage is consumed with a single **atomic** `UPDATE ... SET currentUsage = currentUsage + 1 WHERE apiKey = :hash AND currentUsage < requestLimit` (`:27-32`) — no read-then-write race. +- `rowcount == 0` → re-query to distinguish: unknown hash → **401** `Invalid API key`; known but exhausted → **429** `quota exceeded`. Missing header → **401** `Missing API key`. + +## Rate limits (related services) + +For context — enforced in sibling controllers, not in `/user/*`: + +| Scope | Endpoint | Limit | +| :--- | :--- | :--- | +| auth | `POST /auth/register`, `POST /auth/login` | 10/minute each | +| auth | `GET /auth/google`, `GET /auth/callback` | 5/minute each | +| prometheus | `POST /prometheus/chat/stream` | 5/minute | +| prometheus | `DELETE /prometheus/workspace/delete` | 30/minute | +| user | `/user/*` | unlimited | -Roles combine multiple permissions: -- **USER**: VIEW_PROFILE | USE_THOTH | USE_MAAT -- **PREMIUM**: USER | USE_PROMETHEUS | USE_OGUM +## Not implemented + +Password recovery, 2FA, and profile editing (no `PATCH /user/me` or equivalent) do not exist in `main/controller/user_controller.py:1-115`. The full route list is: `GET /user/health`, `GET /user/me`, `GET /user/admin`, `GET /user/sessions`, `GET /user/sessions/current`, `DELETE /user/sessions/{sessionId}`, `POST /user/sessions/revoke-all`. ## Workflow @@ -159,21 +142,24 @@ Roles combine multiple permissions: graph TD User["User Profile"] --> Me["GET /user/me"] Me --> View["View Profile Data"] - - User --> Upgrade["POST /user/upgrade/developer/starter"] - Upgrade --> Verify["Check Existing Roles"] - Verify -- Not Dev --> Apply["Apply DEVELOPER_STARTER role"] - Apply --> Success["Access to Developer API Keys"] - + User --> Sessions["GET /user/sessions"] - Sessions --> ListSessions["List All Sessions"] - ListSessions --> ViewDevice["View Device Info"] - + Sessions --> ListSessions["List All Sessions (limit/offset)"] + ListSessions --> ViewDevice["View deviceType + userAgent"] + Sessions --> Revoke["DELETE /user/sessions/{id}"] Revoke --> MarkInactive["Mark Session Inactive"] MarkInactive --> LoggedOut["Device Logged Out"] + + Sessions --> RevokeAll["POST /user/sessions/revoke-all"] + RevokeAll --> AllOut["All sessions incl. current revoked"] + + User --> Admin["GET /user/admin"] + Admin --> Check{"ADMIN in roles?"} + Check -- Yes --> Granted["Access granted"] + Check -- No --> Denied["403 denied"] ``` ## License -Mansa Team's MODIFIED GPL 3.0 License. See LICENSE for details. \ No newline at end of file +Mansa Team's MODIFIED GPL 3.0 License. See LICENSE for details. diff --git a/graphify-out/.graphify_labels.json b/graphify-out/.graphify_labels.json index 6c5685b..eb9f6ae 100644 --- a/graphify-out/.graphify_labels.json +++ b/graphify-out/.graphify_labels.json @@ -494,6 +494,7 @@ "492": "Community 492", "493": "Community 493", "494": "Community 494", + "495": "Community 495", "496": "Community 496", "497": "Community 497", "498": "Community 498", @@ -523,6 +524,7 @@ "522": "Community 522", "523": "Community 523", "524": "Community 524", + "525": "Community 525", "526": "Community 526", "527": "Community 527", "528": "Community 528", @@ -567,9 +569,20 @@ "567": "Community 567", "568": "Community 568", "569": "Community 569", + "570": "Community 570", + "571": "Community 571", + "572": "Community 572", "573": "Community 573", + "574": "Community 574", "575": "Community 575", "576": "Community 576", "577": "Community 577", - "580": "Community 580" + "578": "Community 578", + "579": "Community 579", + "580": "Community 580", + "581": "Community 581", + "582": "Community 582", + "583": "Community 583", + "584": "Community 584", + "585": "Community 585" } diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md index 9b30420..26642c9 100644 --- a/graphify-out/GRAPH_REPORT.md +++ b/graphify-out/GRAPH_REPORT.md @@ -1,16 +1,16 @@ -# Graph Report - server (2026-09-14) +# Graph Report - server (2026-09-15) ## Corpus Check -- 124 files · ~74,098 words +- 123 files · ~73,844 words - Verdict: corpus is large enough that graph structure adds value. ## Summary -- 6049 nodes · 8145 edges · 573 communities (342 shown, 231 thin omitted) +- 6079 nodes · 8195 edges · 586 communities (345 shown, 241 thin omitted) - Extraction: 84% EXTRACTED · 16% INFERRED · 0% AMBIGUOUS · INFERRED: 1273 edges (avg confidence: 0.69) - Token cost: 0 input · 0 output ## Graph Freshness -- Built from commit: `f4e8f0bc` +- Built from commit: `1e23e042` - Run `git rev-parse HEAD` and compare to check if the graph is stale. - Run `graphify update .` after code changes (no API cost). @@ -501,6 +501,7 @@ - [[_COMMUNITY_Community 492|Community 492]] - [[_COMMUNITY_Community 493|Community 493]] - [[_COMMUNITY_Community 494|Community 494]] +- [[_COMMUNITY_Community 495|Community 495]] - [[_COMMUNITY_Community 497|Community 497]] - [[_COMMUNITY_Community 498|Community 498]] - [[_COMMUNITY_Community 499|Community 499]] @@ -524,6 +525,7 @@ - [[_COMMUNITY_Community 522|Community 522]] - [[_COMMUNITY_Community 523|Community 523]] - [[_COMMUNITY_Community 524|Community 524]] +- [[_COMMUNITY_Community 525|Community 525]] - [[_COMMUNITY_Community 526|Community 526]] - [[_COMMUNITY_Community 527|Community 527]] - [[_COMMUNITY_Community 528|Community 528]] @@ -568,11 +570,22 @@ - [[_COMMUNITY_Community 567|Community 567]] - [[_COMMUNITY_Community 568|Community 568]] - [[_COMMUNITY_Community 569|Community 569]] +- [[_COMMUNITY_Community 570|Community 570]] +- [[_COMMUNITY_Community 571|Community 571]] +- [[_COMMUNITY_Community 572|Community 572]] - [[_COMMUNITY_Community 573|Community 573]] +- [[_COMMUNITY_Community 574|Community 574]] - [[_COMMUNITY_Community 575|Community 575]] - [[_COMMUNITY_Community 576|Community 576]] - [[_COMMUNITY_Community 577|Community 577]] +- [[_COMMUNITY_Community 578|Community 578]] +- [[_COMMUNITY_Community 579|Community 579]] - [[_COMMUNITY_Community 580|Community 580]] +- [[_COMMUNITY_Community 581|Community 581]] +- [[_COMMUNITY_Community 582|Community 582]] +- [[_COMMUNITY_Community 583|Community 583]] +- [[_COMMUNITY_Community 584|Community 584]] +- [[_COMMUNITY_Community 585|Community 585]] ## God Nodes (most connected - your core abstractions) 1. `vocab` - 456 edges @@ -587,6 +600,8 @@ 10. `Prometheus` - 41 edges ## Surprising Connections (you probably didn't know these) +- `lifespan()` --calls--> `runAll()` [INFERRED] + run.py → main/utils/service_manager.py - `StocksCacheManager` --calls--> `test_cache_scheduler_starts_apscheduler()` [INFERRED] main/app/stocks_api/cache.py → tests/test_stocks_api_coverage.py - `StocksCacheManager` --calls--> `test_cache_scheduler_starts_daemon_thread()` [INFERRED] @@ -595,8 +610,6 @@ main/app/stocks_api/key.py → tests/test_stocks_api_coverage.py - `createKey()` --calls--> `test_create_key_exception_rollback()` [INFERRED] main/app/stocks_api/key.py → tests/test_stocks_api_coverage.py -- `HarnessState` --uses--> `TestGetState` [INFERRED] - main/app/prometheus/state.py → tests/test_state_tools.py ## Hyperedges (group relationships) - **Authentication Module** — AuthenticationManager, SessionManager, auth_util, auth_constants, getGoogleSSO [INFERRED] @@ -606,7 +619,7 @@ - **Configuration & Database Infrastructure** — config_Config, config_engine, config_stocksEngine [INFERRED] - **User Authentication & Authorization** — user_service, authentication, user_roles, permission_system [INFERRED] -## Communities (573 total, 231 thin omitted) +## Communities (586 total, 241 thin omitted) ### Community 0 - "Stocks API Endpoints" Cohesion: 0.0 @@ -621,7 +634,7 @@ Cohesion: 0.13 Nodes (21): Thin async wrapper around the CubeSandbox/E2B HTTP API. All methods are sta, SandboxManager, _mock_forgevm(), Unit tests for SandboxManager — HTTP calls mocked via a fake client class., Wire up mock forgevm AsyncClient that returns sandbox with all methods., Wire up mock forgevm AsyncClient that returns sandbox with all methods., test_create_sandbox(), test_destroy_sandbox() (+13 more) ### Community 3 - "Prometheus Agent" -Cohesion: 0.07 +Cohesion: 0.08 Nodes (23): Tests covering query.py lines 22-48., Tests covering query.py lines 22-48., Tests covering query.py lines 22-48., Tests covering query.py lines 22-48., Tests covering query.py lines 22-48., Tests covering cache.py lines 28-76., Tests covering cache.py lines 28-76., Regression: is_string_dtype fails when column has strings + None (pandas 2.x). (+15 more) ### Community 4 - "Data Models & Types" @@ -641,8 +654,8 @@ Cohesion: 0.07 Nodes (29): Algorithmic Compression (`compact.py`) Implementation Plan, code:python (# main/app/prometheus/compact.py), code:python (# Before:), code:python (# Before:), code:python (# Before:), code:bash (pytest tests/ -k "prometheus" -v), code:bash (git add main/app/prometheus/agent.py), code:bash (git mv main/app/prometheus/summarizer.py main/app/prometheus) (+21 more) ### Community 8 - "Device Detection" -Cohesion: 0.08 -Nodes (9): HarnessState, Retrieve a value from state. Returns default if key not found., Return a copy of the current state., Format state as a string for injection into the LLM context., Check if state changed since last reset., Reset the changed flag. Returns the previous state., Clear all state data., In-memory state dict that persists across loop iterations within a single reques (+1 more) +Cohesion: 0.06 +Nodes (27): HarnessState, Retrieve a value from state. Returns default if key not found., Return a copy of the current state., Format state as a string for injection into the LLM context., Check if state changed since last reset., Reset the changed flag. Returns the previous state., Clear all state data., In-memory state dict that persists across loop iterations within a single reques (+19 more) ### Community 9 - "Server Configuration" Cohesion: 0.11 @@ -657,28 +670,28 @@ Cohesion: 0.05 Nodes (42): Code Review Report — Final, H1. Session Cookies Over HTTP, H2. Service → Controller Layer Violations, H3. Bare `except:` Blocks in Scraper, H4. Full DataFrame Copy Per Request, H5. Missing Database Indexes, H6. Scraper N+1 HTTP Pattern, H7. Raw `SessionLocal()` Bypassing DI (+34 more) ### Community 12 - "Frontend App Shell" -Cohesion: 0.1 -Nodes (9): LoopLogger, LoopLogger — batched event logging for observable agent loops., Queue events during a loop, flush to DB at end., Log a generic event with optional metadata., Log a tool invocation., Log end of a turn with timing., If DB insert fails, flush should log error, not raise., Loop events coexist with user/assistant messages in the same history list. (+1 more) +Cohesion: 0.08 +Nodes (13): LoopEvent, LoopEvent model for observable agent loops., LoopLogger, LoopLogger — batched event logging for observable agent loops., Queue events during a loop, flush to DB at end., Log a generic event with optional metadata., Log a tool invocation., Log end of a turn with timing. (+5 more) ### Community 13 - "Prometheus Tools" -Cohesion: 0.2 -Nodes (14): benchOnce(), main(), _fulltext_search(), fullTextSearch(), minMax(), scoreCandidates(), scoreRecency(), scoreRow() (+6 more) +Cohesion: 0.26 +Nodes (8): Empty matrix → empty array., Single row matches cosine_similarity., Multiple rows ranked correctly., Zero query → all zeros., TestBatchCosineSimilarity, batch_cosine_similarity(), batchCosineSimilarity(), Vectorized cosine similarity: one query against N embeddings. ### Community 14 - "User Roles & Permissions" Cohesion: 0.05 -Nodes (37): _make_stocksapi_client(), Covers line 35: GET /stocks/historical., Covers line 35: GET /stocks/historical., Covers line 35: GET /stocks/historical., Covers line 35: GET /stocks/historical., Covers line 47: GET /stocks/fundamental., Covers line 47: GET /stocks/fundamental., Covers line 47: GET /stocks/fundamental. (+29 more) +Nodes (36): _make_stocksapi_client(), Covers line 35: GET /stocks/historical., Covers line 35: GET /stocks/historical., Covers line 35: GET /stocks/historical., Covers line 35: GET /stocks/historical., Covers line 47: GET /stocks/fundamental., Covers line 47: GET /stocks/fundamental., Covers line 47: GET /stocks/fundamental. (+28 more) ### Community 15 - "Community 15" Cohesion: 0.05 Nodes (38): code:block1 (User 123: "Analyze PETR4 vs VALE3 correlation"), code:python (from main.app.prometheus.sandbox import SandboxManager), code:python (TOOL_REGISTRY: dict[str, Any] = {), code:bash (git add main/app/prometheus/tools.py tests/test_sandbox_tool), code:python (import pytest), code:python (from main.app.prometheus.sandbox import SandboxManager), code:python (async def streamMessage(self, query=None, sessionId=None, db), code:python (## Code Sandbox (On-Demand)) (+30 more) ### Community 16 - "Community 16" -Cohesion: 0.09 -Nodes (20): Covers lines 114-115, 117-120, 122, 125: POST /prometheus/chat., Covers lines 114-115, 117-120, 122, 125: POST /prometheus/chat., Covers lines 109-136: POST /prometheus/chat/stream (SSE)., Covers lines 114-115, 117-120, 122: existing session with verified ownership., Covers lines 114-115, 117-120, 122: existing session with verified ownership., Covers lines 114-115, 117-120, 122: existing session with verified ownership., Covers lines 120-121: existing session with verified ownership., Covers lines 114-115, 117-120, 122, 125: POST /prometheus/chat. (+12 more) +Cohesion: 0.06 +Nodes (31): _make_prometheus_client(), Covers lines 114-115, 117-120, 122, 125: POST /prometheus/chat., Covers lines 114-115, 117-120, 122, 125: POST /prometheus/chat., Covers lines 111-112: sessionId is None, new session created., Covers lines 111-112: sessionId is None, new session created., Covers lines 109-136: POST /prometheus/chat/stream (SSE)., Covers lines 118-119: sessionId is None, new session created., Covers lines 114-115, 117-120, 122: existing session with verified ownership. (+23 more) ### Community 17 - "Community 17" -Cohesion: 0.11 -Nodes (17): Multiple search terms with tickerIndex., Multiple search terms with tickerIndex., Multiple search terms with tickerIndex., Search with no index match falls back to string startswith., Search with no index match falls back to string startswith., Search with no index match falls back to string startswith., Multiple search terms with tickerIndex., Multiple search terms with tickerIndex. (+9 more) +Cohesion: 0.08 +Nodes (24): search.strip() == '' should still dedup (line 181)., search.strip() == '' should still dedup (line 181)., search.strip() == '' should still dedup (line 181)., DataFrame without TIME column., Invalid date -> inner 400 caught by outer except -> 500., DataFrame without TIME column., DataFrame without TIME column., search.strip() == '' should still dedup (line 181). (+16 more) ### Community 18 - "Community 18" Cohesion: 0.07 @@ -693,16 +706,16 @@ Cohesion: 0.06 Nodes (35): 1. Memory System (B+), 2. Summarizer/Episodes (B), 3. Loop Events (A-), 4. Core Architecture (B+), 5. Security (B+), 6. Performance (B), 7. Code Quality (B), After (B+) (+27 more) ### Community 21 - "Community 21" -Cohesion: 0.06 -Nodes (23): _make_stocks_df(), Return a small DataFrame with the columns the query module expects., Return a small DataFrame with the columns the query module expects., Tests covering query.py lines 77-132., Tests covering query.py lines 77-132., Tests covering query.py lines 77-132., Tests covering query.py lines 77-132., Tests covering query.py lines 77-132. (+15 more) +Cohesion: 0.12 +Nodes (4): B3Scraper, getCurrentSelic(), getInitialData(), calculateInvestingScore() ### Community 22 - "Community 22" Cohesion: 0.14 Nodes (7): filterCotationColumn(), Tests for queryLiveCotation and /stocks/cotations/live., Tests for queryLiveCotation and /stocks/cotations/live., Tests for queryLiveCotation and /stocks/cotations/live., Tests for queryLiveCotation and /stocks/cotations/live., Tests for queryLiveCotation and /stocks/cotations/live., TestQueryLiveCotation ### Community 23 - "Community 23" -Cohesion: 0.06 -Nodes (32): Admin Access, API Endpoints, code:bash (curl http://localhost:3200/user/health), code:json ({), code:bash (curl -X DELETE -H "Authorization: Bearer " http://loc), code:json ({), code:bash (curl -X POST -H "Authorization: Bearer " http://local), code:json ({) (+24 more) +Cohesion: 0.07 +Nodes (35): Admin Access, API endpoints, API keys (Stocks API), code:bash (curl http://localhost:3200/user/health), code:mermaid (graph TD), code:bash (curl -X DELETE -H "Authorization: Bearer " http://loc), code:json ({), code:bash (curl -X POST -H "Authorization: Bearer " http://local) (+27 more) ### Community 24 - "Community 24" Cohesion: 0.09 @@ -722,7 +735,7 @@ Nodes (15): getUserMemories(), getRelevanceScore(), _FakeMemory, A memory with n ### Community 28 - "Community 28" Cohesion: 0.07 -Nodes (27): No historical data columns -> inner 400 caught by outer except -> 500., No historical data columns -> inner 400 caught by outer except -> 500., If an unexpected exception occurs in queryHistorical., No historical data columns -> inner 400 caught by outer except -> 500., No historical data columns -> inner 400 caught by outer except -> 500., If an unexpected exception occurs (line 132)., If an unexpected exception occurs (line 132)., Historical query with a year range. (+19 more) +Nodes (26): Pass field name WITHOUT year (how categorizeColumns returns them)., Pass field name WITHOUT year (how categorizeColumns returns them)., No historical data columns -> inner 400 caught by outer except -> 500., Pass field name WITHOUT year (how categorizeColumns returns them)., Pass field name WITHOUT year (how categorizeColumns returns them)., No historical data columns -> inner 400 caught by outer except -> 500., If an unexpected exception occurs in queryHistorical., No historical data columns -> inner 400 caught by outer except -> 500. (+18 more) ### Community 29 - "Community 29" Cohesion: 0.09 @@ -765,24 +778,24 @@ Cohesion: 0.07 Nodes (27): code:json ([), code:javascript (const loadHistory = async (sid) => {), code:jsx (export default function MessageList({ messages, toolEvents, ), code:javascript (const loadHistory = async (sid) => {), code:jsx (export default function AgentLoop({ toolEvents, turnMetrics ), code:bash (git add frontend/src/App.jsx frontend/src/components/Message), code:bash (docker-compose up -d --build), code:sql (SELECT COUNT(*) FROM prometheus WHERE JSON_CONTAINS_PATH(his) (+19 more) ### Community 39 - "Community 39" -Cohesion: 0.05 -Nodes (40): Invalid date -> inner 400 passes through (not wrapped as 500)., Invalid date -> inner 400 caught by outer except -> 500., Invalid date -> inner 400 caught by outer except -> 500., Invalid date -> inner 400 caught by outer except -> 500., search.strip() == '' should still dedup (line 181)., search.strip() == '' should still dedup (line 181)., Invalid date -> inner 400 caught by outer except -> 500., Invalid date -> inner 400 caught by outer except -> 500. (+32 more) +Cohesion: 0.08 +Nodes (24): Two dates in the range, both valid., Two dates in the range, both valid., Two dates in the range, both valid., Search with no index match falls back to string startswith., Search with no index match falls back to string startswith., search.strip() == '' should still dedup (line 181)., Search with no index match falls back to string startswith., Two dates in the range, both valid. (+16 more) ### Community 40 - "Community 40" Cohesion: 0.12 Nodes (26): _make_callback_client(), Tests for OAuth callback security - JWT token should NOT be in URL. Token is de, Verify frontend can still auth after OAuth redirect via cookie., Return (client, app, mock_session) for testing Google callback., Return (client, app, mock_session) for testing Google callback., Verify frontend can still get token after OAuth redirect., Verify frontend can still get token after OAuth redirect., Frontend JavaScript should be able to read token from readable cookie. (+18 more) ### Community 41 - "Community 41" -Cohesion: 0.08 -Nodes (25): API Endpoints, Authentication Management, code:env (#), code:bash (curl http://localhost:3200/auth/health), code:bash (curl -X POST "http://localhost:3200/auth/register" \), code:bash (curl -X POST "http://localhost:3200/auth/login" \), code:bash (curl -X GET "http://localhost:3200/auth/me" \), code:bash (curl -X POST "http://localhost:3200/auth/logout" \) (+17 more) +Cohesion: 0.07 +Nodes (32): API endpoints, Authentication Management, code:bash (curl http://localhost:3200/auth/health), code:bash (curl -X POST "http://localhost:3200/auth/register" \), code:bash (curl -X POST "http://localhost:3200/auth/login" \), code:bash (curl -X POST "http://localhost:3200/auth/logout" \), code:bash (# Browser redirect; redirect_url optional, else Referer head), code:mermaid (graph TD) (+24 more) ### Community 42 - "Community 42" Cohesion: 0.09 Nodes (16): StocksCacheManager, Tests for dynamic ticker index feature, Ticker index should be built when cache is loaded, Ticker index should contain all tickers from cache, Ticker index should be case-insensitive, Looking up ticker should return valid row index, Ticker index should be rebuilt when cache refreshes, TestTickerIndex (+8 more) ### Community 43 - "Community 43" -Cohesion: 0.1 -Nodes (11): Authentication System, authenticateUser(), createUserAccount(), createAccessToken(), hashPassword(), verifyPassword(), Google OAuth, JWT Authentication (+3 more) +Cohesion: 0.18 +Nodes (4): hashPassword(), verifyPassword(), TestAuthUtil, TestAuthUtilEdgeCases ### Community 44 - "Community 44" Cohesion: 0.14 @@ -793,8 +806,8 @@ Cohesion: 0.09 Nodes (5): Tests for main/utils/roles.py — covers requirePermission and edge cases., TestCheckAccess, TestPermissionAll, TestRequirePermission, TestRolesHierarchy ### Community 46 - "Community 46" -Cohesion: 0.09 -Nodes (21): Regression: queryFundamental must not mutate the shared cache TIME column., Regression: queryFundamental must not mutate the shared cache TIME column., Regression: queryFundamental must not mutate the shared cache TIME column., Single invalid date -> inner 400 passes through., Single invalid date -> inner 400 caught by outer except -> 500., Single invalid date -> inner 400 caught by outer except -> 500., Single invalid date -> inner 400 caught by outer except -> 500., Invalid fields now raise 400 with actionable error message. (+13 more) +Cohesion: 0.11 +Nodes (17): Single invalid date -> inner 400 passes through., Single invalid date -> inner 400 caught by outer except -> 500., Single invalid date -> inner 400 caught by outer except -> 500., Single invalid date -> inner 400 caught by outer except -> 500., Invalid fields now raise 400 with actionable error message., Fields that don't exist in the dataframe are filtered out., search.strip() == '' should still dedup (line 181)., Fields that don't exist in the dataframe are filtered out. (+9 more) ### Community 47 - "Community 47" Cohesion: 0.1 @@ -805,8 +818,8 @@ Cohesion: 0.06 Nodes (34): Backend (COMMIT), code:bash (cd frontend && pnpm add @openuidev/react-lang), code:bash (rm frontend/src/components/MdocMessage.jsx), code:python ("""OpenUI Lang system prompt section for Prometheus agent.), code:block12, code:block13, code:block14, code:block15 (+26 more) ### Community 49 - "Community 49" -Cohesion: 0.13 -Nodes (18): dispatchToolCall(), TDD tests: verify memory tools are wired into the Prometheus agent. RED: Thes, test_memory_tool_skipped_without_user(), test_non_memory_tool_not_routed_to_executeMemoryTool(), test_non_registry_tool_not_routed(), test_save_memory_routed_to_executeMemoryTool(), test_save_memory_routed_via_registry(), test_search_memory_routed_to_executeMemoryTool() (+10 more) +Cohesion: 0.07 +Nodes (30): dispatchToolCall(), TDD tests: verify memory tools are wired into the Prometheus agent. RED: Thes, dispatchToolCall must route memory tool names via TOOL_REGISTRY., makeChat must include MEMORY_TOOLS alongside MCP sessions., makeChat must include MEMORY_TOOLS alongside MCP sessions., makeChat must include MEMORY_TOOLS alongside MCP sessions., makeChat must include MEMORY_TOOLS alongside MCP sessions., dispatchToolCall must route memory tool names to executeMemoryTool. (+22 more) ### Community 50 - "Community 50" Cohesion: 0.07 @@ -822,7 +835,7 @@ Nodes (7): Cover all methods in chat.py (lines 11-120)., Cover all methods in ch ### Community 53 - "Community 53" Cohesion: 0.11 -Nodes (31): applyUpdate(), archiveDead(), clearAll(), clearAllAsync(), count_memories(), countMemories(), countTokensCached(), decayScores() (+23 more) +Nodes (30): applyUpdate(), archiveDead(), clearAll(), clearAllAsync(), count_memories(), countMemories(), countTokensCached(), decayScores() (+22 more) ### Community 54 - "Community 54" Cohesion: 0.2 @@ -841,12 +854,12 @@ Cohesion: 0.09 Nodes (15): Performance benchmark tests for stocks API, Performance benchmark tests for stocks API, Ticker index lookup should be O(1) - very fast, Ticker index lookup should be O(1) - very fast, Prefix scan should be much slower than index lookup, Prefix scan should be much slower than index lookup, Index lookup should be significantly faster than scan, Index lookup should be significantly faster than scan (+7 more) ### Community 58 - "Community 58" -Cohesion: 0.25 -Nodes (10): googleCallback(), isSecureScheme(), issueSessionCookie(), login(), logout(), register(), resolveCookieDomain(), Covers line 23: isSecureScheme helper. (+2 more) +Cohesion: 0.17 +Nodes (15): getGoogleSSO(), createAccessToken(), googleCallback(), googleLogin(), isSecureScheme(), issueSessionCookie(), login(), logout() (+7 more) ### Community 59 - "Community 59" -Cohesion: 0.06 -Nodes (38): lifespan(), status(), initialize(), initialize(), MCPDetectMiddleware, StocksAPIService, Tests for main/utils/connectivity.py — covers all branches., checkServiceConnection — success, not found, errors. (+30 more) +Cohesion: 0.17 +Nodes (20): Tests for main/utils/connectivity.py — covers all branches., test_both_engines_ok(), test_connection_error(), test_generic_exception(), test_non_200_status(), test_non_stocks_prefix(), test_request_exception(), test_service_not_found() (+12 more) ### Community 60 - "Community 60" Cohesion: 0.09 @@ -857,8 +870,8 @@ Cohesion: 0.1 Nodes (20): architectures, attention_probs_dropout_prob, gradient_checkpointing, hidden_act, hidden_dropout_prob, hidden_size, initializer_range, intermediate_size (+12 more) ### Community 63 - "Community 63" -Cohesion: 0.29 -Nodes (4): Shared query pipeline for historical and fundamental endpoints., Fetch live prices for B3 tickers via yfinance. B3 tickers must match, sanitizeNanValues(), StocksQueryManager +Cohesion: 0.26 +Nodes (3): Shared query pipeline for historical and fundamental endpoints., sanitizeNanValues(), ResponseCache ### Community 64 - "Community 64" Cohesion: 0.06 @@ -866,15 +879,15 @@ Nodes (31): code:python (class StocksCacheManager:), code:bash (python -m pytest ### Community 65 - "Community 65" Cohesion: 0.1 -Nodes (19): API Endpoints, API Key Verification, Brazilian Stocks Market API, code:env (#), code:bash (curl http://localhost:3200/stocks/health), code:bash (curl -H "X-API-Key: YOUR_KEY" http://localhost:3200/stocks/k), code:bash (curl "http://localhost:3200/stocks/key/generate?userId=1"), code:bash (curl -H "X-API-Key: YOUR_KEY" "http://localhost:3200/stocks/) (+11 more) +Nodes (25): API Endpoints, API Key Verification, Architecture, Auth, Brazilian Stocks Market API, code:env (STOCKSAPI_ENABLED=TRUE), code:bash (curl http://localhost:3200/stocks/health), code:bash (curl http://localhost:3200/stocks/fields) (+17 more) ### Community 66 - "Community 66" Cohesion: 0.1 Nodes (19): 1. Explore Agent — Prometheus Architecture, 2. MySQL Vector Storage (Researcher), 3. Memory Patterns (Researcher), A. Vector Embedding Integration, B. Pandas-First Vector Cache, C. Search Upgrade, code:python (class MemoryCache:), code:python (def searchMemories(cls, db, userId, query, embedding=None, l) (+11 more) ### Community 67 - "Community 67" -Cohesion: 0.21 -Nodes (7): ResultCache — SHA256-keyed file-based cache for computed results., File-based cache keyed by SHA256 of code. Stores results as JSON under:, Return cached result dict or None if miss., Store result with timestamp., Delete all cached results for a session., Check if a result exists for the given code., ResultCache +Cohesion: 0.15 +Nodes (11): _count_memories(), _create_memory(), _get_memory(), Keys with Jaccard > 0.8 should merge., Keys with Jaccard > 0.8 should merge., Keys with low similarity should not merge., Keys with low similarity should not merge., Keys with low similarity should not merge. (+3 more) ### Community 68 - "Community 68" Cohesion: 0.13 @@ -925,8 +938,8 @@ Cohesion: 0.05 Nodes (44): cn(), AlertDialogAction(), AlertDialogCancel(), AlertDialogContent(), AlertDialogDescription(), AlertDialogFooter(), AlertDialogHeader(), AlertDialogMedia() (+36 more) ### Community 80 - "Community 80" -Cohesion: 0.15 -Nodes (19): buildSummary(), charCount(), countTokens(), dedup(), extractDecisions(), extractMetrics(), extractSnapshots(), extractTickers() (+11 more) +Cohesion: 0.1 +Nodes (20): buildSummary(), charCount(), countTokens(), dedup(), extractDecisions(), extractMetrics(), extractSnapshots(), extractTickers() (+12 more) ### Community 81 - "Community 81" Cohesion: 0.17 @@ -937,12 +950,12 @@ Cohesion: 0.16 Nodes (14): arrowTypeFor(), buildCotationDateIndex(), buildFeatherCache(), buildTickerIndex(), optimizeDtypes(), P1: establish the sorted-cache invariant once at load/refresh. Sorts by (, P1: first-occurrence index over a sortCacheFrame-sorted frame. The cache, Get cached stocks data with optional column filtering. (+6 more) ### Community 83 - "Community 83" -Cohesion: 0.12 -Nodes (16): Brazilian Stocks Market Scraper, code:env (#), code:json ({), Configuration Parameters, Constraint Engine ($\Lambda$), Engines, Fundamental Engine ($\Phi$), Global Score Function (+8 more) +Cohesion: 0.1 +Nodes (21): B3 Market Scraper, Brazilian Stocks Market Scraper, code:env (SCRAPER_ENABLED=FALSE # default False), code:json ({), Configuration Parameters, Constraint Engine ($\Lambda$), Engines, Fundamental Engine ($\Phi$) (+13 more) ### Community 84 - "Community 84" -Cohesion: 0.14 -Nodes (12): chat(), chat_stream(), createSession(), downloadWorkspaceFile(), _forward(), getHistory(), Verify the user owns the session, raise 403 otherwise., Verify the user owns the session, raise 403 otherwise. (+4 more) +Cohesion: 0.1 +Nodes (18): chat(), chat_stream(), create_memory(), createMemory(), createSession(), downloadWorkspaceFile(), _forward(), getHistory() (+10 more) ### Community 85 - "Community 85" Cohesion: 0.21 @@ -1001,16 +1014,16 @@ Cohesion: 0.28 Nodes (6): extractTokenPayload(), Tests for extractTokenPayload — the standalone token extraction dependency., Create a mock Starlette Request with given headers., Authorization: Bearer (empty) — no token after Bearer., Authorization: Basic xxx — not Bearer, so no token found., TestExtractTokenPayload ### Community 99 - "Community 99" -Cohesion: 0.05 -Nodes (33): _make_prometheus_client(), Covers lines 111-112: sessionId is None, new session created., Covers lines 111-112: sessionId is None, new session created., Covers lines 118-119: sessionId is None, new session created., Covers lines 111-112: sessionId is None, new session created., Return (client, app) with prometheus router and mocked deps., Covers lines 33-36: GET /prometheus/sessions., Covers lines 33-36: GET /prometheus/sessions. (+25 more) +Cohesion: 0.1 +Nodes (17): Covers lines 62-63, 65-68: PUT /prometheus/sessions/{sessionId}., Covers lines 62-63, 65-68: PUT /prometheus/sessions/{sessionId}., Covers lines 65-68: title updated successfully., Covers lines 65-68: title updated successfully., Covers lines 62-63, 65-68: PUT /prometheus/sessions/{sessionId}., Covers lines 65-68: title updated successfully., Covers lines 62-63: not the session owner., Covers lines 62-63: not the session owner. (+9 more) ### Community 100 - "Community 100" Cohesion: 0.16 -Nodes (6): _assert_gemini_safe(), Assert a tool function has only Gemini-compatible parameter types., Assert a tool function has only Gemini-compatible parameter types., test_set_state_no_state_returns_error(), test_tool_has_gemini_safe_signature(), TestStateToolFunctions +Nodes (6): _assert_gemini_safe(), Assert a tool function has only Gemini-compatible parameter types., Assert a tool function has only Gemini-compatible parameter types., test_get_state_no_state_returns_error(), test_tool_has_gemini_safe_signature(), TestStateToolFunctions ### Community 101 - "Community 101" -Cohesion: 0.25 -Nodes (4): LoopEvent, LoopEvent model for observable agent loops., Tests for LoopLogger — appends events to history JSON list., TestLoopEventModel +Cohesion: 0.15 +Nodes (6): Fetch live prices for B3 tickers via yfinance. B3 tickers must match, StocksQueryManager, Regression: queryFundamental must not mutate the shared cache TIME column., Regression: queryFundamental must not mutate the shared cache TIME column., Regression: queryFundamental must not mutate the shared cache TIME column., Regression: queryFundamental must not mutate the shared cache TIME column. ### Community 102 - "Community 102" Cohesion: 0.12 @@ -1021,8 +1034,8 @@ Cohesion: 0.13 Nodes (14): 10. Performance, 11. Testing, 12. Risks, 13. Out of Scope (YAGNI), 14. Open Questions, 1. Executive Summary, 2. Context & Motivation, 5. Architecture Decision (+6 more) ### Community 104 - "Community 104" -Cohesion: 0.06 -Nodes (34): Covers lines 83-84: session not found., Covers lines 126-136: DELETE /user/sessions/{sessionId}., Covers lines 126-136: DELETE /user/sessions/{sessionId}., Covers lines 126, 131, 135-136., Covers lines 126, 131, 135-136., Covers lines 126-136: DELETE /user/sessions/{sessionId}., Covers lines 126, 131, 135-136., Covers lines 127-129: session not found. (+26 more) +Cohesion: 0.07 +Nodes (26): Covers lines 114-115: session ownership check fails., Covers lines 114-115: session ownership check fails., Covers lines 114-115: session ownership check fails., Covers lines 120-121: session ownership check fails., Covers lines 114-115: session ownership check fails., Covers lines 126-136: DELETE /user/sessions/{sessionId}., Covers lines 126-136: DELETE /user/sessions/{sessionId}., Covers lines 126, 131, 135-136. (+18 more) ### Community 106 - "Community 106" Cohesion: 0.22 @@ -1041,32 +1054,32 @@ Cohesion: 0.14 Nodes (13): cls_token, do_basic_tokenize, do_lower_case, mask_token, model_max_length, name_or_path, never_split, pad_token (+5 more) ### Community 110 - "Community 110" -Cohesion: 0.14 -Nodes (11): Integration tests for the verifyAPIKey function., Test successful API key verification., Integration tests for the verifyAPIKey function., Test API key verification when quota is exceeded., Test API key verification with invalid key., Test API key verification with missing key., Test API key verification with invalid key., Test that API key system can be disabled. (+3 more) +Cohesion: 0.21 +Nodes (7): ResultCache — SHA256-keyed file-based cache for computed results., File-based cache keyed by SHA256 of code. Stores results as JSON under:, Return cached result dict or None if miss., Store result with timestamp., Delete all cached results for a session., Check if a result exists for the given code., ResultCache ### Community 111 - "Community 111" Cohesion: 0.14 Nodes (13): code:python (import pytest), code:python (import logging), code:bash (git add main/app/prometheus/state.py tests/test_harness_stat), File Map, Global Constraints, Phase 1: HarnessState (In-Memory Agent Scratchpad), Prometheus Harness — Master Implementation Plan (v2: CubeSandbox + On-Demand), Relationship to Existing Systems (+5 more) ### Community 112 - "Community 112" -Cohesion: 0.2 -Nodes (14): Store a value in state. Marks state as changed for context injection., compactCotations(), compactRow(), compactValue(), compressResponse(), fixHeaders(), getAbbr(), getNest() (+6 more) +Cohesion: 0.06 +Nodes (23): _make_stocks_df(), Return a small DataFrame with the columns the query module expects., Return a small DataFrame with the columns the query module expects., Tests covering query.py lines 77-132., Tests covering query.py lines 77-132., Tests covering query.py lines 77-132., Tests covering query.py lines 77-132., Tests covering query.py lines 77-132. (+15 more) ### Community 113 - "Community 113" Cohesion: 0.15 Nodes (7): write_file returns False when host write fails (e.g. invalid path chars)., read_file reads from host filesystem., write_file writes to host filesystem., list_files lists host filesystem entries., list_files returns empty for missing directory., read_file raises FileNotFoundError for missing file., TestSandboxManager ### Community 114 - "Community 114" -Cohesion: 0.17 -Nodes (12): Covers line 67: extractTokenPayload re-raises HTTPException from verifyAccessTok, Covers line 67: extractTokenPayload re-raises HTTPException from verifyAccessTok, Covers line 67: HTTPException raised by verifyAccessToken is re-raised., Covers line 67: extractTokenPayload re-raises HTTPException from verifyAccessTok, Covers line 67: extractTokenPayload re-raises HTTPException from verifyAccessTok, Covers line 67: HTTPException raised by verifyAccessToken is re-raised., Covers line 67: HTTPException raised by verifyAccessToken is re-raised., Covers line 67: extractTokenPayload re-raises HTTPException from verifyAccessTok (+4 more) +Cohesion: 0.29 +Nodes (6): Covers line 67: HTTPException raised by verifyAccessToken is re-raised., Covers line 67: extractTokenPayload re-raises HTTPException from verifyAccessTok, Covers line 67: HTTPException raised by verifyAccessToken is re-raised., Covers line 67: HTTPException raised by verifyAccessToken is re-raised., Covers line 67: HTTPException raised by verifyAccessToken is re-raised., Covers line 67: HTTPException raised by verifyAccessToken is re-raised. ### Community 115 - "Community 115" Cohesion: 0.17 Nodes (11): dateOnly(), EditDividendDialog(), EditLotDialog(), fmtBRL(), fmtMoney(), KIND_STYLES, lotTitle(), deleteDividend() (+3 more) ### Community 116 - "Community 116" -Cohesion: 0.14 -Nodes (15): _build_system_prompt(), buildSystemPrompt(), chatSession(), _execute_memory_tool(), _get_client(), _get_memory_tools(), getClient(), openMCPClients() (+7 more) +Cohesion: 0.13 +Nodes (17): _build_system_prompt(), buildSystemPrompt(), chatSession(), _execute_memory_tool(), executeMemoryTool(), _get_client(), _get_memory_tools(), getClient() (+9 more) ### Community 117 - "Community 117" Cohesion: 0.15 @@ -1081,8 +1094,8 @@ Cohesion: 0.07 Nodes (26): code:python ("""Tests for SandboxManager file mutation helpers (delete_fi), code:python (from main.app.prometheus.sandbox import SandboxManager, host), code:python (@router.post("/workspace/upload")), code:bash (git add main/controller/prometheus_controller.py tests/test_), code:python (from unittest.mock import patch, MagicMock), code:python (from main.app.prometheus.sandbox import SandboxManager, host), code:python (async def serve_file(path: str, **_) -> dict:), code:python ("serve_file": serve_file,) (+18 more) ### Community 120 - "Community 120" -Cohesion: 0.09 -Nodes (35): _make_auth_client(), Tests to cover uncovered lines across controllers, UserManager, and auth util., Covers lines 44-54, 63, 66-71: register success, ValueError, generic Exception., Covers lines 44-54, 63, 66-71: register success, ValueError, generic Exception., Covers lines 87-93, 102: login success and failure paths., Covers lines 87-93, 102: login success and failure paths., Return (client, app) with auth + user routers and mocked getSession., Covers lines 107, 109-130, 133: logout token extraction and revocation. (+27 more) +Cohesion: 0.14 +Nodes (23): _make_auth_client(), Tests to cover uncovered lines across controllers, UserManager, and auth util., Return (client, app) with auth + user routers and mocked getSession., test_callback_existing_user(), test_callback_generic_exception(), test_callback_new_user(), test_callback_no_user_info(), test_callback_with_state_redirect() (+15 more) ### Community 121 - "Community 121" Cohesion: 0.21 @@ -1105,8 +1118,8 @@ Cohesion: 0.13 Nodes (3): PrometheusSession, createSession(), TestPrometheusSessionModel ### Community 126 - "Community 126" -Cohesion: 0.33 -Nodes (5): Non-JSON-dict/list string is left as-is., Non-JSON-dict/list string is left as-is., Non-JSON-dict/list string is left as-is., Non-JSON-dict/list string is left as-is., Non-JSON-dict/list string is left as-is. +Cohesion: 0.2 +Nodes (14): benchOnce(), main(), _fulltext_search(), fullTextSearch(), minMax(), scoreCandidates(), scoreRecency(), scoreRow() (+6 more) ### Community 127 - "Community 127" Cohesion: 0.2 @@ -1121,16 +1134,16 @@ Cohesion: 0.2 Nodes (10): Tests for stocks API field validation — verifies the fields parameter accepts a, Integration: /stocks/fundamental must accept slash and dot fields., Minimal TestClient with just the stocks router for validation tests., GET /fundamental?fields=P/L must not return 422 (validation error)., GET /fundamental?fields=P/L must not return 422 (validation error)., Integration: /stocks/fundamental must accept slash and dot fields., GET /fundamental?fields=P/L must not return 422 (validation error)., GET /historical?fields=P/L must not return 422. (+2 more) ### Community 130 - "Community 130" -Cohesion: 0.33 -Nodes (5): Performance tests for query operations, Query should respond within 1 second, Performance tests for query operations, Query should respond within 1 second, TestQueryPerformance +Cohesion: 0.07 +Nodes (20): Tests for connection pool configuration, Stocks engine should have optimized pool settings, Tests for lazy JSON deserialization, Query manager should have deserialize method, Integration tests for all query optimizations, All optimizations should be implemented, Query filter should use ticker index, Tests for optimized search filtering (+12 more) ### Community 131 - "Community 131" -Cohesion: 0.12 -Nodes (16): pack → unpack preserves values., Empty list roundtrips., 384-dim vector packs to 1536 bytes., Empty matrix → empty array., Single row matches cosine_similarity., Multiple rows ranked correctly., Zero query → all zeros., TestBatchCosineSimilarity (+8 more) +Cohesion: 0.11 +Nodes (17): Same input → same hash., Different inputs → different hashes., Returns 32-char hex string., pack → unpack preserves values., Empty list roundtrips., 384-dim vector packs to 1536 bytes., TestContentHash, TestPackUnpack (+9 more) ### Community 132 - "Community 132" Cohesion: 0.25 -Nodes (7): code:python ("""add wallet_holdings and wallet_lots tables), code:python (import main.models.wallet), code:bash (git add migrations/versions/wallet_tables_20260904_add_walle), File Structure, Global Constraints, Task 2: Alembic migration for wallet tables, Wallet Management (Thoth/Iyagba) Implementation Plan +Nodes (7): code:python (from dataclasses import dataclass), code:bash (git add main/app/wallet/__init__.py main/app/wallet/math.py ), code:python (from datetime import date), File Structure, Global Constraints, Task 3: Pure derivation math, Wallet Management (Thoth/Iyagba) Implementation Plan ### Community 133 - "Community 133" Cohesion: 0.18 @@ -1145,12 +1158,12 @@ Cohesion: 0.11 Nodes (4): cache(), Tests for ResultCache., TestColumnValidator, TestResultCache ### Community 136 - "Community 136" -Cohesion: 0.29 -Nodes (6): GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422. +Cohesion: 0.13 +Nodes (13): Covers lines 83-84: session not found., Covers lines 77, 83-84, 86: GET /prometheus/history/{sessionId}., Covers lines 77, 83-84, 86: GET /prometheus/history/{sessionId}., Covers lines 77, 86: session found with history., Covers lines 77, 86: session found with history., Covers lines 77, 83-84, 86: GET /prometheus/history/{sessionId}., Covers lines 77, 86: session found with history., Covers lines 77, 83-84, 86: GET /prometheus/history/{sessionId}. (+5 more) ### Community 137 - "Community 137" -Cohesion: 0.18 -Nodes (11): client(), TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with stocks router + verifyAPIKey + getCurrentUser overrides., TestClient with all routers mounted — no lifespan (no DB/service init). O (+3 more) +Cohesion: 0.14 +Nodes (9): Verify that getSession() returns per-thread Session instances., Calling getSession() twice in the same thread returns the same object., Two threads must NOT share a Session object., With 20 concurrent threads, every thread must get its own Session., The returned object must be a real requests.Session., TestGetSession, get_session(), Return a requests.Session for the current thread. Sessions are created la (+1 more) ### Community 138 - "Community 138" Cohesion: 0.18 @@ -1161,8 +1174,8 @@ Cohesion: 0.24 Nodes (6): Dataset, produce_data(), Train script for a single file Need to set the TPU address first: export XRT_TP, A class that handles the reddit data files, A class that handles one dataset, RedditDataset ### Community 140 - "Community 140" -Cohesion: 0.04 -Nodes (54): Base, PrometheusMemory, PrometheusMemory, MemoryCandidate, MemoryManager, PrometheusMemory, All memory operations. Stateless class methods., Config (+46 more) +Cohesion: 0.11 +Nodes (28): Base, PrometheusMemory, PrometheusMemory, MemoryManager, PrometheusMemory, All memory operations. Stateless class methods., PrometheusService, TestDifferentKeysNoMerge (+20 more) ### Community 141 - "Community 141" Cohesion: 0.24 @@ -1240,10 +1253,6 @@ Nodes (17): §2 Service/Business Separation — MVC 4/10 (Historical layering sc Cohesion: 0.11 Nodes (18): Category 2: Async/Sync Inconsistencies (MEDIUM), Category 4: Caching & Memory (MEDIUM), Category 6: Configuration & Environment (LOW), Category 7: Code Quality (LOW), Executive Summary, Full Code Review Report, Issue 2.1 — All route handlers are synchronous, Issue 2.2 — ServiceManager runs uvicorn in daemon threads (+10 more) -### Community 162 - "Community 162" -Cohesion: 0.25 -Nodes (5): Thread-safe proxy that delegates to per-thread sessions., SessionProxy, get_session(), Return a requests.Session for the current thread. Sessions are created la, Return a requests.Session for the current thread. Sessions are created la - ### Community 163 - "Community 163" Cohesion: 0.22 Nodes (8): code:bash (# Build and start), code:env (#), code:bash (curl http://localhost:3200/health), Environment Setup, Health Check, License, Mansa Server, Run with Docker @@ -1328,10 +1337,6 @@ Nodes (6): Tests for run.py /status endpoint — covers status response structur Cohesion: 0.38 Nodes (7): code:python (import pytest), code:python (from __future__ import annotations), code:bash (git add main/app/prometheus/context.py tests/test_context.py), Phase 4: ToolContext (Bundled Dispatch Dependencies), Phase 4: ToolContext (Replace God Function), Task 5: ToolContext — Dataclass for Agent Use, Task 5: ToolContext — Single Dispatch Object -### Community 186 - "Community 186" -Cohesion: 0.2 -Nodes (6): Verify that getSession() returns per-thread Session instances., Calling getSession() twice in the same thread returns the same object., Two threads must NOT share a Session object., With 20 concurrent threads, every thread must get its own Session., The returned object must be a real requests.Session., TestGetSession - ### Community 187 - "Community 187" Cohesion: 0.29 Nodes (6): DEVELOPER:, PREMIUM:, Prometheus, STOCKS_API, USER:, User structure defined by string roles: @@ -1417,8 +1422,8 @@ Cohesion: 0.33 Nodes (6): API Design (6), Architecture (8), Frontend (7), P1 — Should Fix, Security (6), Testing (4) ### Community 208 - "Community 208" -Cohesion: 0.25 -Nodes (8): Same input → same hash., Different inputs → different hashes., Returns 32-char hex string., TestContentHash, content_hash(), contentHash(), MD5 hash for change detection., MD5 hash for change detection. +Cohesion: 0.18 +Nodes (11): Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback. (+3 more) ### Community 209 - "Community 209" Cohesion: 0.33 @@ -1441,8 +1446,8 @@ Cohesion: 0.17 Nodes (11): code:python (def test_search_defersEmbeddingBlob(db):), code:python (from contextlib import contextmanager), code:python (from sqlalchemy.orm import defer), code:bash (git add main/app/prometheus/memory.py tests/test_memory_sear), code:python (def test_search_fusesFulltextOverVectorOnly(db):), code:python (def minMax(values: list[float]) -> list[float]:), code:bash (git add main/app/prometheus/memory.py tests/test_memory_sear), Global Constraints (+3 more) ### Community 215 - "Community 215" -Cohesion: 0.33 -Nodes (4): Integration tests for all query optimizations, All optimizations should be implemented, Query filter should use ticker index, TestQueryOptimization +Cohesion: 0.2 +Nodes (14): Store a value in state. Marks state as changed for context injection., compactCotations(), compactRow(), compactValue(), compressResponse(), fixHeaders(), getAbbr(), getNest() (+6 more) ### Community 216 - "Community 216" Cohesion: 0.29 @@ -1513,8 +1518,8 @@ Cohesion: 0.4 Nodes (5): 8. Build Sequence (4 phases, each independently shippable), Phase 0 — Sandbox foundation (1-2 days, no user-facing change), Phase 1 — MCP exposure of STOCKS_API (1 day), Phase 2 — Refactor PROMETHEUS to agentic (3-5 days, the big one), Phase 3 — Hardening (1-2 days, can ship incrementally) ### Community 234 - "Community 234" -Cohesion: 0.14 -Nodes (3): getCurrentSelic(), getInitialData(), calculateInvestingScore() +Cohesion: 0.29 +Nodes (6): GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422., GET /stocks/realtime-cotation without search returns 422. ### Community 236 - "Community 236" Cohesion: 0.5 @@ -1605,8 +1610,8 @@ Cohesion: 0.22 Nodes (8): 1. Prime owns the goal, lanes own the work, 2. Dispatch: `delegate()`, one per lane, one turn, 3. Delegate toolsets vary — verify each lane, 4. Trust nothing — verify everything, 5. Windows PowerShell survival, 6. Finish per lane, not per swarm, 7. Standing bans (this repo), SWARMS.md — subagent swarm playbook (OpenCode / Hermes) ### Community 474 - "Community 474" -Cohesion: 0.4 -Nodes (4): getGoogleSSO(), googleLogin(), test_get_google_sso_default_redirect(), test_get_google_sso_with_redirect() +Cohesion: 0.18 +Nodes (6): System prompt should include state context when provided., System prompt should not include state section when empty., State section should appear after memories section., All state entries should appear in the prompt., System prompt should work without state parameter., TestBuildSystemPromptState ### Community 476 - "Community 476" Cohesion: 0.22 @@ -1632,10 +1637,6 @@ Nodes (4): code:python (def test_extract_temporal_info():), code:python (# main/ Cohesion: 0.5 Nodes (4): code:python (def test_session_scoped_memory(db_session, sample_user):), code:python (# Add to main/models/memory.py), code:bash (git add main/models/memory.py main/app/prometheus/memory.py ), Task 8: Session Scoping -### Community 482 - "Community 482" -Cohesion: 0.11 -Nodes (4): FastAPI, Tests for inline pagination params (used in user + prometheus controllers)., TestPaginationParams, PaginationParams - ### Community 483 - "Community 483" Cohesion: 0.5 Nodes (4): code:python (def test_consolidation_preserves_decisions():), code:python (# Add to main/app/prometheus/summarizer.py), code:bash (git add main/app/prometheus/summarizer.py tests/test_consoli), Task 9: Memory Consolidation @@ -1654,59 +1655,63 @@ Nodes (6): CHART_COLORS, PortfolioBarsCard(), PortfolioPieCard(), tooltipStyle, ### Community 487 - "Community 487" Cohesion: 0.16 -Nodes (14): execute_code(), Store a value in the harness state for this session. Use this to save inter, Execute Python code in an isolated sandbox. Use for quantitative analysis,, Read a file from the workspace. Args: path: Path to the file (e., Execute Python code in an isolated sandbox. Use for quantitative analysis,, Execute Python code in an isolated sandbox. Use for quantitative analysis,, Execute Python code in an isolated sandbox. Use for quantitative analysis,, Execute Python code in an isolated sandbox. Use for quantitative analysis, (+6 more) +Nodes (14): execute_code(), Store a value in the harness state for this session. Use this to save inter, Execute Python code in an isolated sandbox. Use for quantitative analysis,, Execute Python code in an isolated sandbox. Use for quantitative analysis,, Execute Python code in an isolated sandbox. Use for quantitative analysis,, Execute Python code in an isolated sandbox. Use for quantitative analysis,, Execute Python code in an isolated sandbox. Use for quantitative analysis,, Execute Python code in an isolated sandbox. Use for quantitative analysis, (+6 more) ### Community 488 - "Community 488" -Cohesion: 0.4 -Nodes (4): COTACAO 10Y PADRAO and COTACAO 10Y AJUSTADA belong to /cotations, not /fundament, COTACAO 10Y PADRAO and COTACAO 10Y AJUSTADA belong to /cotations, not /fundament, COTACAO 10Y PADRAO and COTACAO 10Y AJUSTADA belong to /cotations, not /fundament, COTACAO 10Y PADRAO and COTACAO 10Y AJUSTADA belong to /cotations, not /fundament +Cohesion: 0.32 +Nodes (4): memoryMaintenance(), _create(), After 10 cycles, preference (0.99^10) > context (0.90^10)., TestTypeAwareDecay ### Community 489 - "Community 489" Cohesion: 0.6 Nodes (4): hammer_measured(), main(), Fire n requests with c concurrent workers, measuring ttfb + total per request., stats() ### Community 490 - "Community 490" -Cohesion: 0.33 -Nodes (5): Tests for optimized search filtering, Filter should use ticker index for O(1) lookup, Tests for optimized search filtering, Filter should use ticker index for O(1) lookup, TestFilterBySearchTerms +Cohesion: 0.22 +Nodes (8): API Endpoints, code:env (PROMETHEUS_ENABLED=TRUE), code:bash (python run.py), code:mermaid (graph TD), License, Orunmila, Usage, Workflow ### Community 491 - "Community 491" -Cohesion: 0.5 -Nodes (4): code:python (from dataclasses import dataclass), code:bash (git add main/app/wallet/__init__.py main/app/wallet/math.py ), code:python (from datetime import date), Task 3: Pure derivation math +Cohesion: 0.25 +Nodes (4): Authentication System, Google OAuth, JWT Authentication, TestSessionExpiryConfig ### Community 492 - "Community 492" Cohesion: 0.33 Nodes (5): Baseline (lane 4), Export recipe, Move triggers (any one fires the migration), Options, Vector Scale-Up Runbook ### Community 493 - "Community 493" -Cohesion: 0.05 -Nodes (37): Covers line 27: user already has the role., Covers line 27: user already has the role., Covers line 27: user already has the role., Covers lines 34, 36-38, 40-44, 46, 48-49, 51, 58-59, 61, 63-67: UserManager.getC, Covers lines 34, 36-38, 40-44, 46, 48-49, 51, 58-59, 61, 63-67: UserManager.getC, Covers lines 34, 36-38, 40-44, 46, 48-49, 51, 58-59, 61, 63-67: UserManager.getC, Covers lines 34, 36-38, 40-44, 46, 48-49, 51, 58-59, 61, 63-67: UserManager.getC, Covers lines 36-38, 40-44, 46, 48-49, 51, 58-59, 61: successful user retrieval. (+29 more) +Cohesion: 0.07 +Nodes (28): Covers lines 34, 36-38, 40-44, 46, 48-49, 51, 58-59, 61, 63-67: UserManager.getC, Covers lines 34, 36-38, 40-44, 46, 48-49, 51, 58-59, 61, 63-67: UserManager.getC, Covers lines 34, 36-38, 40-44, 46, 48-49, 51, 58-59, 61, 63-67: UserManager.getC, Covers lines 34, 36-38, 40-44, 46, 48-49, 51, 58-59, 61, 63-67: UserManager.getC, Covers lines 36-38, 40-44, 46, 48-49, 51, 58-59, 61: successful user retrieval., Covers lines 36-38, 40-44, 46, 48-49, 51, 58-59, 61: successful user retrieval., Covers lines 34, 36-38, 40-44, 46, 48-49, 51, 58-59, 61, 63-67: UserManager.getC, Covers lines 36-38, 40-44, 46, 48-49, 51, 58-59, 61: successful user retrieval. (+20 more) + +### Community 495 - "Community 495" +Cohesion: 0.29 +Nodes (7): check_cache(), Read a file from the sandbox filesystem. Args: path: Absolute pa, List files in the workspace directory. Args: path: Directory pat, Upload a file to the sandbox filesystem. Use this to push data files (CSV,, Check if a computed result exists in the cache. Use before executing expens, read_sandbox_file(), upload_to_sandbox() ### Community 497 - "Community 497" -Cohesion: 0.18 -Nodes (11): Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback., Store a memory about the user's preferences, analysis results, or feedback. (+3 more) +Cohesion: 0.2 +Nodes (9): Invalid date -> inner 400 passes through (not wrapped as 500)., Invalid date -> inner 400 caught by outer except -> 500., Invalid date -> inner 400 caught by outer except -> 500., Invalid date -> inner 400 caught by outer except -> 500., Invalid date -> inner 400 caught by outer except -> 500., Invalid date -> inner 400 caught by outer except -> 500., Invalid date -> inner 400 caught by outer except -> 500., Two dates in the range, both valid. (+1 more) ### Community 498 - "Community 498" Cohesion: 0.05 -Nodes (38): AuthenticationManager, IntFlag, Covers line 18: GET /stocks/health., Covers line 18: GET /stocks/health., Covers line 18: GET /stocks/health., Covers line 18: GET /stocks/health., Covers line 18: GET /stocks/health., Covers line 28: GET /auth/health. (+30 more) +Nodes (53): AuthenticationManager, IntFlag, MemoryCandidate, Covers line 18: GET /stocks/health., Covers line 18: GET /stocks/health., Covers line 18: GET /stocks/health., Covers line 18: GET /stocks/health., Covers line 18: GET /stocks/health. (+45 more) ### Community 499 - "Community 499" Cohesion: 0.2 Nodes (9): code:python (import numpy as np), code:python (def normalizeRows(matrix: np.ndarray) -> np.ndarray:), code:bash (git add main/app/prometheus/vector.py tests/test_vector_norm), code:python ("""One-shot: renormalize stored embeddings to unit norm. Usa), code:bash (git add scripts/backfill_normalize_embeddings.py), Global Constraints, Lane 1: Normalized Embeddings + Dot-Product Search Implementation Plan, Task 1: Normalize on encode + row-normalize helper (+1 more) ### Community 500 - "Community 500" -Cohesion: 0.18 -Nodes (6): System prompt should include state context when provided., System prompt should not include state section when empty., State section should appear after memories section., All state entries should appear in the prompt., System prompt should work without state parameter., TestBuildSystemPromptState +Cohesion: 0.22 +Nodes (4): authenticateUser(), createUserAccount(), FastAPI, PaginationParams ### Community 501 - "Community 501" -Cohesion: 0.2 -Nodes (4): verifyAccessToken(), getCurrentSession(), getSessions(), sessionToDict() +Cohesion: 0.22 +Nodes (3): getCurrentSession(), getSessions(), sessionToDict() ### Community 502 - "Community 502" Cohesion: 0.08 Nodes (20): Tests for connection pool configuration, Tests for connection pool configuration, Stocks engine should have optimized pool settings, Stocks engine should have optimized pool settings, Tests for lazy JSON deserialization, Tests for lazy JSON deserialization, Query manager should have deserialize method, Query manager should have deserialize method (+12 more) ### Community 503 - "Community 503" -Cohesion: 0.1 -Nodes (13): Tests for connection pool configuration, Stocks engine should have optimized pool settings, Tests for lazy JSON deserialization, Query manager should have deserialize method, Tests for dynamic ticker index feature, Ticker index should be built when cache is loaded, Ticker index should contain all tickers from cache, Ticker index should be case-insensitive (+5 more) +Cohesion: 0.17 +Nodes (7): Tests for dynamic ticker index feature, Ticker index should be built when cache is loaded, Ticker index should contain all tickers from cache, Ticker index should be case-insensitive, Looking up ticker should return valid row index, Ticker index should be rebuilt when cache refreshes, TestTickerIndex ### Community 505 - "Community 505" Cohesion: 0.33 @@ -1728,49 +1733,49 @@ Nodes (5): Disputed (already litigated — needs your ruling to proceed), Held o Cohesion: 0.6 Nodes (3): bench(), main(), stats() -### Community 512 - "Community 512" -Cohesion: 0.22 -Nodes (7): Integration tests for all query optimizations, Integration tests for all query optimizations, All optimizations should be implemented, All optimizations should be implemented, Query filter should use ticker index, Query filter should use ticker index, TestQueryOptimization - ### Community 517 - "Community 517" Cohesion: 0.2 Nodes (16): baseFrame(), deserializeJsonColumns(), envelope(), fetchLivePayload(), filterBySearchTerms(), _filterCotationByDate(), filterCotationData(), finalize() (+8 more) ### Community 518 - "Community 518" Cohesion: 0.06 -Nodes (30): memoryMaintenance(), create_memories(), Zero access but score still above threshold → not archived., Even with low score, if accessed → not archived., Even with low score, if accessed → not archived., Already archived memories are skipped., Already archived memories are skipped., Decay happens first, then archive check with new scores. (+22 more) +Nodes (26): create_memories(), Zero access but score still above threshold → not archived., Even with low score, if accessed → not archived., Even with low score, if accessed → not archived., Already archived memories are skipped., Already archived memories are skipped., Decay happens first, then archive check with new scores., Decay happens first, then archive check with new scores. (+18 more) ### Community 519 - "Community 519" Cohesion: 0.57 Nodes (6): addRole(), addRoleToUser(), getCurrentUser(), getRolesList(), hasRole(), toDict() ### Community 520 - "Community 520" -Cohesion: 0.33 -Nodes (5): pd.NA is not a string, so lambda returns it unchanged., pd.NA is not a string, so lambda returns it unchanged., pd.NA is not a string, so lambda returns it unchanged., pd.NA is not a string, so lambda returns it unchanged., pd.NA is not a string, so lambda returns it unchanged. +Cohesion: 0.15 +Nodes (10): replaceNan handles direct float NaN values (line 34)., pd.NA is not a string, so lambda returns it unchanged., replaceNan handles direct float NaN values (line 34)., replaceNan handles direct float NaN values (line 34)., replaceNan handles direct float NaN values (line 34)., replaceNan handles direct float NaN values (line 34)., pd.NA is not a string, so lambda returns it unchanged., pd.NA is not a string, so lambda returns it unchanged. (+2 more) ### Community 521 - "Community 521" -Cohesion: 0.2 -Nodes (9): Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132). (+1 more) +Cohesion: 0.22 +Nodes (8): Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false. ### Community 522 - "Community 522" -Cohesion: 0.16 -Nodes (5): Tests for main/utils/http_session.py — covers all branches., TestCleanup, TestGetSession, cleanup(), Close the main thread's session at interpreter shutdown. +Cohesion: 0.22 +Nodes (7): Integration tests for all query optimizations, Integration tests for all query optimizations, All optimizations should be implemented, All optimizations should be implemented, Query filter should use ticker index, Query filter should use ticker index, TestQueryOptimization ### Community 523 - "Community 523" Cohesion: 0.11 Nodes (21): list_files(), Write a file to the workspace. Use this to save data files (CSV, JSON, scri, Write a file to the workspace. Use this to save data files (CSV, JSON, scri, Write a file to the workspace. Use this to save data files (CSV, JSON, scri, Write a file to the workspace. Use this to save data files (CSV, JSON, scri, Write a file to the workspace. Use this to save data files (CSV, JSON, scri, List files in the workspace directory. Args: path: Directory pat, List files in the workspace directory. Args: path: Directory pat (+13 more) ### Community 524 - "Community 524" -Cohesion: 0.11 -Nodes (17): Covers lines 45-51: verifyAccessToken with expired and invalid tokens., Covers line 16: empty password raises ValueError., Covers lines 48-49: jwt.ExpiredSignatureError., Covers lines 45-51: verifyAccessToken with expired and invalid tokens., Covers lines 45-51: verifyAccessToken with expired and invalid tokens., Covers lines 48-49: jwt.ExpiredSignatureError., Covers lines 45-51: verifyAccessToken with expired and invalid tokens., Covers lines 48-49: jwt.ExpiredSignatureError. (+9 more) +Cohesion: 0.12 +Nodes (16): Covers line 16: empty password raises ValueError., Covers line 16: empty password raises ValueError., Covers line 16: empty password raises ValueError., Covers lines 45-51: verifyAccessToken with expired and invalid tokens., Covers line 16: empty password raises ValueError., Covers lines 48-49: jwt.ExpiredSignatureError., Covers lines 45-51: verifyAccessToken with expired and invalid tokens., Covers lines 45-51: verifyAccessToken with expired and invalid tokens. (+8 more) + +### Community 525 - "Community 525" +Cohesion: 0.25 +Nodes (8): Read a file from the workspace. Args: path: Path to the file (e., Read a file from the workspace. Args: path: Path to the file (e., Read a file from the workspace. Args: path: Path to the file (e., Read a file from the workspace. Args: path: Path to the file (e., Read a file from the sandbox filesystem. Args: path: Absolute pa, Read a file from the sandbox filesystem. Args: path: Absolute pa, Read a file from the workspace. Args: path: Path to the file (e., read_file() ### Community 526 - "Community 526" Cohesion: 0.33 Nodes (7): buildKey(), clearAll(), getMatrix(), invalidateUser(), runAwait(), main(), One-shot: renormalize stored embeddings to unit norm. Usage: python scripts/back ### Community 528 - "Community 528" -Cohesion: 0.11 -Nodes (16): Covers lines 13, 17, 19-20, 22-27: UserManager.addRoleToUser., Covers lines 13, 17, 19-20, 22-27: UserManager.addRoleToUser., Covers lines 17, 22-27: user found, role not present, role added., Covers lines 17, 22-27: user found, role not present, role added., Covers lines 13, 17, 19-20, 22-27: UserManager.addRoleToUser., Covers lines 17, 22-27: user found, role not present, role added., Covers lines 13, 17, 19-20, 22-27: UserManager.addRoleToUser., Covers lines 17, 22-27: user found, role not present, role added. (+8 more) +Cohesion: 0.29 +Nodes (6): Covers lines 19-20: user not found raises 404., Covers lines 19-20: user not found raises 404., Covers lines 19-20: user not found raises 404., Covers lines 19-20: user not found raises 404., Covers lines 19-20: user not found raises 404., Covers lines 19-20: user not found raises 404. ### Community 530 - "Community 530" Cohesion: 0.39 @@ -1789,28 +1794,40 @@ Cohesion: 0.5 Nodes (4): LATER (P2 — when touching these files), NOW (P0 — fix before next release), Priority Matrix, SOON (P1 — fix within 2 weeks) ### Community 535 - "Community 535" -Cohesion: 0.33 -Nodes (5): replaceNan handles direct float NaN values (line 34)., replaceNan handles direct float NaN values (line 34)., replaceNan handles direct float NaN values (line 34)., replaceNan handles direct float NaN values (line 34)., replaceNan handles direct float NaN values (line 34). +Cohesion: 0.14 +Nodes (11): Integration tests for the verifyAPIKey function., Test successful API key verification., Integration tests for the verifyAPIKey function., Test API key verification when quota is exceeded., Test API key verification with invalid key., Test API key verification with missing key., Test API key verification with invalid key., Test that API key system can be disabled. (+3 more) ### Community 536 - "Community 536" -Cohesion: 0.14 -Nodes (19): executeStateTool(), get_state(), Retrieve values from the harness state. Use this to recall intermediate results,, Retrieve values from the harness state. Use this to recall intermediate results,, Retrieve values from the harness state. Use this to recall intermediate results,, Retrieve values from the harness state. Use this to recall intermediate results,, test_get_state_no_state_returns_error(), test_dispatch_get_state() (+11 more) +Cohesion: 0.19 +Nodes (9): Config, AuthenticationService, initialize(), initialize(), MCPDetectMiddleware, StocksAPIService, getApp(), runAll() (+1 more) ### Community 538 - "Community 538" Cohesion: 0.4 Nodes (5): Category 8: Testing Gaps (MEDIUM), Issue 8.1 — No integration tests for full request lifecycle, Issue 8.2 — No tests for scraper, stocks query, or cache, Issue 8.3 — No tests for Google OAuth callback, Issue 8.4 — No tests for session cleanup +### Community 539 - "Community 539" +Cohesion: 0.18 +Nodes (11): client(), TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with all routers mounted — no lifespan (no DB/service init). O, TestClient with stocks router + verifyAPIKey + getCurrentUser overrides., TestClient with all routers mounted — no lifespan (no DB/service init). O (+3 more) + ### Community 540 - "Community 540" Cohesion: 0.29 Nodes (6): code:python (import argparse), code:bash (git add bench/bench_memory_vector.py), Global Constraints, Lane 4: Before/After Bench Implementation Plan, Task 1: Bench script with synthetic scale sweep, Task 2: Record baseline and post-lane numbers +### Community 541 - "Community 541" +Cohesion: 0.24 +Nodes (5): lifespan(), status(), checkDatabaseConnection(), checkSingleDb(), runMigrations() + ### Community 542 - "Community 542" Cohesion: 0.5 Nodes (3): at, label, rows ### Community 543 - "Community 543" +Cohesion: 0.2 +Nodes (9): Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132)., Invalid date format raises exception (line 132). (+1 more) + +### Community 544 - "Community 544" Cohesion: 0.22 -Nodes (8): Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false., Hit the actual /stocks/cotations HTTP endpoint with adjusted=false. +Nodes (7): verifyAccessToken(), Covers lines 50-51: jwt.InvalidTokenError., Covers lines 50-51: jwt.InvalidTokenError., Covers lines 50-51: jwt.InvalidTokenError., Covers lines 50-51: jwt.InvalidTokenError., Covers lines 50-51: jwt.InvalidTokenError., Covers lines 50-51: jwt.InvalidTokenError. ### Community 545 - "Community 545" Cohesion: 0.29 @@ -1872,25 +1889,29 @@ Nodes (3): Current code (exact), Lane contracts (interfaces between lanes), Vect Cohesion: 0.5 Nodes (4): code:python (import pytest), code:python (import logging), code:bash (git add main/app/wallet/prices.py tests/test_wallet_prices.p), Task 6: Price client — one batched STOCKS_API fetch per snapshot +### Community 560 - "Community 560" +Cohesion: 0.09 +Nodes (20): Covers lines 13, 17, 19-20, 22-27: UserManager.addRoleToUser., Covers lines 13, 17, 19-20, 22-27: UserManager.addRoleToUser., Covers lines 17, 22-27: user found, role not present, role added., Covers lines 17, 22-27: user found, role not present, role added., Covers lines 13, 17, 19-20, 22-27: UserManager.addRoleToUser., Covers lines 17, 22-27: user found, role not present, role added., Covers lines 13, 17, 19-20, 22-27: UserManager.addRoleToUser., Covers lines 17, 22-27: user found, role not present, role added. (+12 more) + ### Community 562 - "Community 562" -Cohesion: 0.32 -Nodes (7): create_memory(), createMemory(), _downloadModel(), embed(), getEmbeddingModel(), executeMemoryTool(), executeMemoryTool() +Cohesion: 0.22 +Nodes (8): Historical query with a year range., Historical query with a year range., Historical query with a year range., Historical query with a year range., Historical query with a year range., Historical query with a year range., Historical query with a year range., Historical query with a year range. ### Community 563 - "Community 563" -Cohesion: 0.29 -Nodes (7): check_cache(), Read a file from the sandbox filesystem. Args: path: Absolute pa, List files in the workspace directory. Args: path: Directory pat, Upload a file to the sandbox filesystem. Use this to push data files (CSV,, Check if a computed result exists in the cache. Use before executing expens, read_sandbox_file(), upload_to_sandbox() +Cohesion: 0.4 +Nodes (5): initialize(), P5: register the scraper cron jobs on the shared scheduler. Kept in this, registerScraperJobs(), runScraper(), ScraperService ### Community 564 - "Community 564" -Cohesion: 0.29 -Nodes (7): Read a file from the workspace. Args: path: Path to the file (e., Read a file from the workspace. Args: path: Path to the file (e., Read a file from the workspace. Args: path: Path to the file (e., Read a file from the sandbox filesystem. Args: path: Absolute pa, Read a file from the sandbox filesystem. Args: path: Absolute pa, Read a file from the workspace. Args: path: Path to the file (e., read_file() +Cohesion: 0.47 +Nodes (3): TestCleanup, cleanup(), Close the main thread's session at interpreter shutdown. ### Community 565 - "Community 565" Cohesion: 0.33 Nodes (6): Tests covering key.py lines 48-66., Tests covering key.py lines 48-66., Tests covering key.py lines 48-66., Tests covering key.py lines 48-66., Tests covering key.py lines 48-66., TestCreateKey ### Community 566 - "Community 566" -Cohesion: 0.25 -Nodes (7): Pass field name WITHOUT year (how categorizeColumns returns them)., Pass field name WITHOUT year (how categorizeColumns returns them)., Pass field name WITHOUT year (how categorizeColumns returns them)., Pass field name WITHOUT year (how categorizeColumns returns them)., Pass field name WITHOUT year (how categorizeColumns returns them)., Pass field name WITHOUT year (how categorizeColumns returns them)., Pass field name WITHOUT year (how categorizeColumns returns them). +Cohesion: 0.33 +Nodes (5): Non-JSON-dict/list string is left as-is., Non-JSON-dict/list string is left as-is., Non-JSON-dict/list string is left as-is., Non-JSON-dict/list string is left as-is., Non-JSON-dict/list string is left as-is. ### Community 567 - "Community 567" Cohesion: 0.14 @@ -1900,17 +1921,21 @@ Nodes (18): verifyAPIKey(), Tests to increase coverage for query.py, key.py, and Cohesion: 0.29 Nodes (6): GET /cotations without search returns 422., GET /cotations without search returns 422., GET /cotations without search returns 422., GET /cotations without search returns 422., GET /cotations without search returns 422., GET /cotations without search returns 422. -### Community 573 - "Community 573" -Cohesion: 0.33 -Nodes (6): makeChat must include MEMORY_TOOLS alongside MCP sessions., makeChat must include MEMORY_TOOLS alongside MCP sessions., makeChat must include MEMORY_TOOLS alongside MCP sessions., makeChat must include MEMORY_TOOLS alongside MCP sessions., makeChat must include MEMORY_TOOLS alongside MCP sessions., TestMakeChatIncludesMemoryTools +### Community 569 - "Community 569" +Cohesion: 0.5 +Nodes (4): code:python ("""add wallet_holdings and wallet_lots tables), code:python (import main.models.wallet), code:bash (git add migrations/versions/wallet_tables_20260904_add_walle), Task 2: Alembic migration for wallet tables -### Community 575 - "Community 575" +### Community 570 - "Community 570" Cohesion: 0.4 -Nodes (5): initialize(), P5: register the scraper cron jobs on the shared scheduler. Kept in this, registerScraperJobs(), runScraper(), ScraperService +Nodes (4): COTACAO 10Y PADRAO and COTACAO 10Y AJUSTADA belong to /cotations, not /fundament, COTACAO 10Y PADRAO and COTACAO 10Y AJUSTADA belong to /cotations, not /fundament, COTACAO 10Y PADRAO and COTACAO 10Y AJUSTADA belong to /cotations, not /fundament, COTACAO 10Y PADRAO and COTACAO 10Y AJUSTADA belong to /cotations, not /fundament -### Community 576 - "Community 576" -Cohesion: 0.33 -Nodes (6): dispatchToolCall must route memory tool names via TOOL_REGISTRY., dispatchToolCall must route memory tool names to executeMemoryTool., dispatchToolCall must route memory tool names to executeMemoryTool., dispatchToolCall must route memory tool names to executeMemoryTool., dispatchToolCall must route memory tool names to executeMemoryTool., TestDispatchRoutesMemoryTools +### Community 573 - "Community 573" +Cohesion: 0.67 +Nodes (3): checkServiceConnection — success, not found, errors., checkServiceConnection — success, not found, errors., TestCheckServiceConnection + +### Community 574 - "Community 574" +Cohesion: 0.67 +Nodes (3): checkMySqlConnection — success, errors, engine=None paths., checkMySqlConnection — success, errors, engine=None paths., TestCheckMySqlConnection ### Community 577 - "Community 577" Cohesion: 0.33 @@ -1919,16 +1944,16 @@ Nodes (5): Every function in TOOL_REGISTRY must have Gemini-safe signatures. ## Knowledge Gaps - **3054 isolated node(s):** `$schema`, `style`, `rsc`, `tsx`, `config` (+3049 more) These have ≤1 connection - possible missing edges or undocumented components. -- **231 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. +- **241 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. ## Suggested Questions _Questions this graph is uniquely positioned to answer:_ -- **Why does `Pytest Testing` connect `Community 93` to `Authentication Core`, `Frontend Components`, `Community 129`, `Data Models & Types`, `Community 131`, `Community 518`, `Community 135`, `Community 522`, `Community 138`, `Community 140`, `Community 527`, `Community 18`, `Community 147`, `Community 24`, `Community 25`, `Community 536`, `Community 27`, `Community 29`, `Community 32`, `Community 33`, `Community 546`, `Community 40`, `Community 43`, `Community 44`, `Community 45`, `Community 172`, `Community 49`, `Community 51`, `Community 567`, `Community 184`, `Community 59`, `Community 188`, `Community 86`, `Community 475`, `Community 477`, `Community 482`, `Community 100`, `Community 102`, `Community 502`, `Community 503`, `Community 120`, `Community 251`, `Community 125`?** - _High betweenness centrality (0.103) - this node is a cross-community bridge._ -- **Why does `FastAPI` connect `Community 482` to `Community 129`, `Community 517`, `Community 519`, `Community 530`, `Community 18`, `Community 147`, `Community 26`, `Community 33`, `Community 546`, `Community 34`, `Community 40`, `Community 43`, `Community 45`, `Community 567`, `Community 58`, `Community 59`, `Community 197`, `Community 71`, `Community 73`, `Community 84`, `Community 475`, `Community 477`, `Community 498`, `Community 501`, `Community 120`?** - _High betweenness centrality (0.045) - this node is a cross-community bridge._ -- **Why does `Prometheus` connect `Community 116` to `Frontend Components`, `Device Detection`, `Community 138`, `Community 140`, `Frontend App Shell`, `Community 529`, `Community 151`, `Community 24`, `Community 544`, `Community 52`, `Community 569`, `Community 60`, `Community 573`, `Community 576`, `Community 194`, `Community 67`, `Community 68`, `Community 80`, `Community 87`, `Community 88`, `Community 93`, `Community 105`, `Community 500`, `Community 125`?** +- **Why does `Pytest Testing` connect `Community 93` to `Authentication Core`, `Frontend Components`, `Community 129`, `Data Models & Types`, `Community 131`, `Community 518`, `Community 135`, `Device Detection`, `Community 130`, `Community 138`, `Community 140`, `Community 527`, `Community 18`, `Community 147`, `Community 24`, `Community 25`, `Community 27`, `Community 29`, `Community 32`, `Community 33`, `Community 546`, `Community 40`, `Community 44`, `Community 45`, `Community 172`, `Community 49`, `Community 51`, `Community 567`, `Community 184`, `Community 186`, `Community 59`, `Community 188`, `Community 86`, `Community 475`, `Community 120`, `Community 477`, `Community 100`, `Community 102`, `Community 488`, `Community 491`, `Community 500`, `Community 502`, `Community 504`, `Community 251`, `Community 125`?** + _High betweenness centrality (0.081) - this node is a cross-community bridge._ +- **Why does `FastAPI` connect `Community 500` to `Community 129`, `Community 517`, `Community 519`, `Community 530`, `Community 18`, `Community 147`, `Community 536`, `Community 26`, `Community 541`, `Community 544`, `Community 33`, `Community 546`, `Community 34`, `Community 40`, `Community 45`, `Community 567`, `Community 58`, `Community 197`, `Community 71`, `Community 73`, `Community 84`, `Community 475`, `Community 120`, `Community 477`, `Community 498`, `Community 501`, `Community 504`?** + _High betweenness centrality (0.051) - this node is a cross-community bridge._ +- **Why does `UserManager` connect `Community 498` to `Prometheus Agent`, `Community 519`, `Community 136`, `Prometheus Memory`, `Community 524`, `Community 141`, `User Roles & Permissions`, `Community 16`, `Community 22`, `Community 37`, `Community 47`, `Community 560`, `Community 178`, `Community 565`, `Community 567`, `Community 58`, `Community 61`, `Community 68`, `Community 86`, `Community 221`, `Community 99`, `Community 231`, `Community 104`, `Community 107`, `Community 493`, `Community 112`, `Community 125`?** _High betweenness centrality (0.033) - this node is a cross-community bridge._ - **Are the 72 inferred relationships involving `StocksCacheManager` (e.g. with `TestStocksCacheManager` and `TestVerifyAPIKey`) actually correct?** _`StocksCacheManager` has 72 INFERRED edges - model-reasoned connections that need verification._ diff --git a/graphify-out/graph.json b/graphify-out/graph.json index 462adde..54a2146 100644 --- a/graphify-out/graph.json +++ b/graphify-out/graph.json @@ -237,7 +237,7 @@ "source_file": "config.py", "source_location": "L91", "id": "server_config_config", - "community": 140, + "community": 536, "norm_label": "config" }, { @@ -264,7 +264,7 @@ "source_file": "run.py", "source_location": "L1", "id": "run_py", - "community": 59, + "community": 541, "norm_label": "run.py" }, { @@ -273,7 +273,7 @@ "source_file": "run.py", "source_location": "L28", "id": "server_run_lifespan", - "community": 59, + "community": 541, "norm_label": "lifespan()" }, { @@ -282,7 +282,7 @@ "source_file": "run.py", "source_location": "L73", "id": "server_run_health", - "community": 59, + "community": 541, "norm_label": "health()" }, { @@ -291,7 +291,7 @@ "source_file": "run.py", "source_location": "L78", "id": "server_run_status", - "community": 59, + "community": 541, "norm_label": "status()" }, { @@ -300,7 +300,7 @@ "source_file": "run.py", "source_location": "L112", "id": "server_run_triggerscraper", - "community": 59, + "community": 541, "norm_label": "triggerscraper()" }, { @@ -2190,7 +2190,7 @@ "source_file": "main/app/authentication/authentication.py", "source_location": "L1", "id": "main_app_authentication_authentication_py", - "community": 43, + "community": 500, "norm_label": "authentication.py" }, { @@ -2208,7 +2208,7 @@ "source_file": "main/app/authentication/authentication.py", "source_location": "L16", "id": "authentication_authentication_createuseraccount", - "community": 43, + "community": 500, "norm_label": "createuseraccount()" }, { @@ -2217,7 +2217,7 @@ "source_file": "main/app/authentication/authentication.py", "source_location": "L51", "id": "authentication_authentication_authenticategoogleuser", - "community": 43, + "community": 500, "norm_label": "authenticategoogleuser()" }, { @@ -2226,7 +2226,7 @@ "source_file": "main/app/authentication/authentication.py", "source_location": "L65", "id": "authentication_authentication_authenticateuser", - "community": 43, + "community": 500, "norm_label": "authenticateuser()" }, { @@ -2343,7 +2343,7 @@ "source_file": "main/app/authentication/sso.py", "source_location": "L1", "id": "main_app_authentication_sso_py", - "community": 474, + "community": 58, "norm_label": "sso.py" }, { @@ -2352,7 +2352,7 @@ "source_file": "main/app/authentication/sso.py", "source_location": "L6", "id": "authentication_sso_getgooglesso", - "community": 474, + "community": 58, "norm_label": "getgooglesso()" }, { @@ -2361,7 +2361,7 @@ "source_file": "main/app/authentication/util.py", "source_location": "L1", "id": "main_app_authentication_util_py", - "community": 43, + "community": 544, "norm_label": "util.py" }, { @@ -2388,7 +2388,7 @@ "source_file": "main/app/authentication/util.py", "source_location": "L31", "id": "authentication_util_createaccesstoken", - "community": 43, + "community": 58, "norm_label": "createaccesstoken()" }, { @@ -2397,7 +2397,7 @@ "source_file": "main/app/authentication/util.py", "source_location": "L44", "id": "authentication_util_verifyaccesstoken", - "community": 501, + "community": 544, "norm_label": "verifyaccesstoken()" }, { @@ -2901,7 +2901,7 @@ "source_file": "main/app/prometheus/memory.py", "source_location": "L64", "id": "prometheus_memory_memorycandidate", - "community": 140, + "community": 498, "norm_label": "memorycandidate" }, { @@ -2919,7 +2919,7 @@ "source_file": "main/app/prometheus/memory.py", "source_location": "L90", "id": "prometheus_memory_newtokencache", - "community": 53, + "community": 116, "norm_label": "newtokencache()" }, { @@ -2937,7 +2937,7 @@ "source_file": "main/app/prometheus/memory.py", "source_location": "L104", "id": "prometheus_memory_minmax", - "community": 13, + "community": 126, "norm_label": "minmax()" }, { @@ -2964,7 +2964,7 @@ "source_file": "main/app/prometheus/memory.py", "source_location": "L140", "id": "prometheus_memory_scorerow", - "community": 13, + "community": 126, "norm_label": "scorerow()" }, { @@ -2973,7 +2973,7 @@ "source_file": "main/app/prometheus/memory.py", "source_location": "L152", "id": "prometheus_memory_scorerecency", - "community": 13, + "community": 126, "norm_label": "scorerecency()" }, { @@ -2982,7 +2982,7 @@ "source_file": "main/app/prometheus/memory.py", "source_location": "L162", "id": "prometheus_memory_scorecandidates", - "community": 13, + "community": 126, "norm_label": "scorecandidates()" }, { @@ -3045,7 +3045,7 @@ "source_file": "main/app/prometheus/memory.py", "source_location": "L286", "id": "prometheus_memory_search", - "community": 13, + "community": 126, "norm_label": "search()" }, { @@ -3054,7 +3054,7 @@ "source_file": "main/app/prometheus/memory.py", "source_location": "L349", "id": "prometheus_memory_fulltextsearch", - "community": 13, + "community": 126, "norm_label": "fulltextsearch()" }, { @@ -3360,7 +3360,7 @@ "source_file": "main/app/prometheus/tools.py", "source_location": "L1", "id": "main_app_prometheus_tools_py", - "community": 563, + "community": 495, "norm_label": "tools.py" }, { @@ -3378,7 +3378,7 @@ "source_file": "main/app/prometheus/tools.py", "source_location": "L51", "id": "prometheus_tools_save_memory", - "community": 497, + "community": 208, "norm_label": "save_memory()" }, { @@ -3396,7 +3396,7 @@ "source_file": "main/app/prometheus/tools.py", "source_location": "L114", "id": "prometheus_tools_read_file", - "community": 564, + "community": 525, "norm_label": "read_file()" }, { @@ -3450,7 +3450,7 @@ "source_file": "main/app/prometheus/tools.py", "source_location": "L52", "id": "prometheus_tools_rationale_52", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback." }, { @@ -3468,7 +3468,7 @@ "source_file": "main/app/prometheus/tools.py", "source_location": "L115", "id": "prometheus_tools_rationale_115", - "community": 564, + "community": 525, "norm_label": "read a file from the workspace. args: path: path to the file (e." }, { @@ -3504,7 +3504,7 @@ "source_file": "main/app/prometheus/vector.py", "source_location": "L1", "id": "main_app_prometheus_vector_py", - "community": 13, + "community": 126, "norm_label": "vector.py" }, { @@ -3513,7 +3513,7 @@ "source_file": "main/app/prometheus/vector.py", "source_location": "L10", "id": "prometheus_vector_normalizerows", - "community": 13, + "community": 126, "norm_label": "normalizerows()" }, { @@ -3522,7 +3522,7 @@ "source_file": "main/app/prometheus/vector.py", "source_location": "L15", "id": "prometheus_vector_embed", - "community": 13, + "community": 126, "norm_label": "embed()" }, { @@ -3531,7 +3531,7 @@ "source_file": "main/app/prometheus/vector.py", "source_location": "L19", "id": "prometheus_vector_decodeembeddings", - "community": 13, + "community": 126, "norm_label": "decodeembeddings()" }, { @@ -3540,7 +3540,7 @@ "source_file": "main/app/prometheus/vector.py", "source_location": "L41", "id": "prometheus_vector_batchcosinesimilarity", - "community": 13, + "community": 126, "norm_label": "batchcosinesimilarity()" }, { @@ -3558,7 +3558,7 @@ "source_file": "main/app/prometheus/vector.py", "source_location": "L55", "id": "prometheus_vector_tovectorstring", - "community": 13, + "community": 126, "norm_label": "tovectorstring()" }, { @@ -3567,7 +3567,7 @@ "source_file": "main/app/prometheus/vector.py", "source_location": "L59", "id": "prometheus_vector_fromvectorstring", - "community": 13, + "community": 126, "norm_label": "fromvectorstring()" }, { @@ -3585,7 +3585,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L1", "id": "main_app_scraper_b3_scraper_py", - "community": 234, + "community": 21, "norm_label": "scraper.py" }, { @@ -3594,7 +3594,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L32", "id": "scraper_b3_scraper_getcurrentselic", - "community": 234, + "community": 21, "norm_label": "getcurrentselic()" }, { @@ -3603,7 +3603,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L42", "id": "scraper_b3_scraper_b3scraper", - "community": 539, + "community": 21, "norm_label": "b3scraper" }, { @@ -3612,7 +3612,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L43", "id": "scraper_b3_scraper_b3scraper_init", - "community": 234, + "community": 21, "norm_label": ".__init__()" }, { @@ -3621,7 +3621,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L57", "id": "scraper_b3_scraper_getinitialdata", - "community": 234, + "community": 21, "norm_label": "getinitialdata()" }, { @@ -3630,7 +3630,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L112", "id": "scraper_b3_scraper_historicalrentability", - "community": 234, + "community": 21, "norm_label": "historicalrentability()" }, { @@ -3639,7 +3639,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L135", "id": "scraper_b3_scraper_historicaldividends", - "community": 234, + "community": 21, "norm_label": "historicaldividends()" }, { @@ -3648,7 +3648,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L166", "id": "scraper_b3_scraper_historicaldividendyields", - "community": 234, + "community": 21, "norm_label": "historicaldividendyields()" }, { @@ -3657,7 +3657,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L194", "id": "scraper_b3_scraper_historicalrevenue", - "community": 234, + "community": 21, "norm_label": "historicalrevenue()" }, { @@ -3666,7 +3666,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L215", "id": "scraper_b3_scraper_historicalcotationprofits", - "community": 234, + "community": 21, "norm_label": "historicalcotationprofits()" }, { @@ -3675,7 +3675,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L228", "id": "scraper_b3_scraper_b3scraper_historicalcotationprofits_oceans14", - "community": 539, + "community": 21, "norm_label": ".historicalcotationprofits_oceans14()" }, { @@ -3684,7 +3684,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L241", "id": "scraper_b3_scraper_historicalcotations", - "community": 234, + "community": 21, "norm_label": "historicalcotations()" }, { @@ -3693,7 +3693,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L258", "id": "scraper_b3_scraper_tagalong", - "community": 234, + "community": 21, "norm_label": "tagalong()" }, { @@ -3702,7 +3702,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L283", "id": "scraper_b3_scraper_stocknews", - "community": 234, + "community": 21, "norm_label": "stocknews()" }, { @@ -3711,7 +3711,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L296", "id": "scraper_b3_scraper_b3scraper_fundamentalindicators", - "community": 539, + "community": 21, "norm_label": ".fundamentalindicators()" }, { @@ -3720,7 +3720,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L419", "id": "scraper_b3_scraper_b3scraper_processticker", - "community": 539, + "community": 21, "norm_label": ".processticker()" }, { @@ -3729,7 +3729,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L450", "id": "scraper_b3_scraper_b3scraper_scrapestocks", - "community": 539, + "community": 21, "norm_label": ".scrapestocks()" }, { @@ -3738,7 +3738,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L497", "id": "scraper_b3_scraper_b3scraper_reordercolumns", - "community": 539, + "community": 21, "norm_label": ".reordercolumns()" }, { @@ -3747,7 +3747,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L506", "id": "scraper_b3_scraper_b3scraper_serializecomplextypes", - "community": 539, + "community": 21, "norm_label": ".serializecomplextypes()" }, { @@ -3756,7 +3756,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L525", "id": "scraper_b3_scraper_b3scraper_exportjson", - "community": 539, + "community": 21, "norm_label": ".exportjson()" }, { @@ -3765,7 +3765,7 @@ "source_file": "main/app/scraper_b3/scraper.py", "source_location": "L533", "id": "scraper_b3_scraper_b3scraper_exportmysql", - "community": 539, + "community": 21, "norm_label": ".exportmysql()" }, { @@ -3774,7 +3774,7 @@ "source_file": "main/app/scraper_b3/xango.py", "source_location": "L1", "id": "main_app_scraper_b3_xango_py", - "community": 234, + "community": 21, "norm_label": "xango.py" }, { @@ -3783,7 +3783,7 @@ "source_file": "main/app/scraper_b3/xango.py", "source_location": "L15", "id": "scraper_b3_xango_calculateinvestingscore", - "community": 234, + "community": 21, "norm_label": "calculateinvestingscore()" }, { @@ -3909,7 +3909,7 @@ "source_file": "main/app/stocks_api/compress.py", "source_location": "L1", "id": "main_app_stocks_api_compress_py", - "community": 112, + "community": 215, "norm_label": "compress.py" }, { @@ -3918,7 +3918,7 @@ "source_file": "main/app/stocks_api/compress.py", "source_location": "L23", "id": "stocks_api_compress_getabbr", - "community": 112, + "community": 215, "norm_label": "getabbr()" }, { @@ -3927,7 +3927,7 @@ "source_file": "main/app/stocks_api/compress.py", "source_location": "L31", "id": "stocks_api_compress_getnest", - "community": 112, + "community": 215, "norm_label": "getnest()" }, { @@ -3945,7 +3945,7 @@ "source_file": "main/app/stocks_api/compress.py", "source_location": "L46", "id": "stocks_api_compress_compactvalue", - "community": 112, + "community": 215, "norm_label": "compactvalue()" }, { @@ -3954,7 +3954,7 @@ "source_file": "main/app/stocks_api/compress.py", "source_location": "L67", "id": "stocks_api_compress_compactrow", - "community": 112, + "community": 215, "norm_label": "compactrow()" }, { @@ -3963,7 +3963,7 @@ "source_file": "main/app/stocks_api/compress.py", "source_location": "L95", "id": "stocks_api_compress_compactcotations", - "community": 112, + "community": 215, "norm_label": "compactcotations()" }, { @@ -3972,7 +3972,7 @@ "source_file": "main/app/stocks_api/compress.py", "source_location": "L130", "id": "stocks_api_compress_compressresponse", - "community": 112, + "community": 215, "norm_label": "compressresponse()" }, { @@ -4161,7 +4161,7 @@ "source_file": "main/app/stocks_api/util.py", "source_location": "L17", "id": "stocks_api_util_dedupabbrev", - "community": 112, + "community": 215, "norm_label": "dedupabbrev()" }, { @@ -4170,7 +4170,7 @@ "source_file": "main/app/stocks_api/util.py", "source_location": "L26", "id": "stocks_api_util_autoabbreviate", - "community": 112, + "community": 215, "norm_label": "autoabbreviate()" }, { @@ -4179,7 +4179,7 @@ "source_file": "main/app/stocks_api/util.py", "source_location": "L47", "id": "stocks_api_util_generateabbreviations", - "community": 112, + "community": 215, "norm_label": "generateabbreviations()" }, { @@ -4215,7 +4215,7 @@ "source_file": "main/app/stocks_api/util.py", "source_location": "L96", "id": "stocks_api_util_detectnestedfields", - "community": 112, + "community": 215, "norm_label": "detectnestedfields()" }, { @@ -4332,7 +4332,7 @@ "source_file": "main/controller/authentication_controller.py", "source_location": "L155", "id": "controller_authentication_controller_googlelogin", - "community": 474, + "community": 58, "norm_label": "googlelogin()" }, { @@ -4827,7 +4827,7 @@ "source_file": "main/service/authentication_service.py", "source_location": "L1", "id": "main_service_authentication_service_py", - "community": 59, + "community": 536, "norm_label": "authentication_service.py" }, { @@ -4836,7 +4836,7 @@ "source_file": "main/service/authentication_service.py", "source_location": "L9", "id": "service_authentication_service_authenticationservice", - "community": 140, + "community": 536, "norm_label": "authenticationservice" }, { @@ -4845,7 +4845,7 @@ "source_file": "main/service/authentication_service.py", "source_location": "L11", "id": "service_authentication_service_initialize", - "community": 59, + "community": 536, "norm_label": "initialize()" }, { @@ -4863,7 +4863,7 @@ "source_file": "main/service/prometheus_service.py", "source_location": "L23", "id": "service_prometheus_service_memorymaintenance", - "community": 518, + "community": 488, "norm_label": "memorymaintenance()" }, { @@ -4890,7 +4890,7 @@ "source_file": "main/service/scraper_service.py", "source_location": "L1", "id": "main_service_scraper_service_py", - "community": 575, + "community": 563, "norm_label": "scraper_service.py" }, { @@ -4899,7 +4899,7 @@ "source_file": "main/service/scraper_service.py", "source_location": "L13", "id": "service_scraper_service_runscraper", - "community": 575, + "community": 563, "norm_label": "runscraper()" }, { @@ -4908,7 +4908,7 @@ "source_file": "main/service/scraper_service.py", "source_location": "L23", "id": "service_scraper_service_registerscraperjobs", - "community": 575, + "community": 563, "norm_label": "registerscraperjobs()" }, { @@ -4917,7 +4917,7 @@ "source_file": "main/service/scraper_service.py", "source_location": "L49", "id": "service_scraper_service_scraperservice", - "community": 575, + "community": 563, "norm_label": "scraperservice" }, { @@ -4926,7 +4926,7 @@ "source_file": "main/service/scraper_service.py", "source_location": "L51", "id": "service_scraper_service_initialize", - "community": 575, + "community": 563, "norm_label": "initialize()" }, { @@ -4935,7 +4935,7 @@ "source_file": "main/service/stocksapi_service.py", "source_location": "L1", "id": "main_service_stocksapi_service_py", - "community": 59, + "community": 536, "norm_label": "stocksapi_service.py" }, { @@ -4944,7 +4944,7 @@ "source_file": "main/service/stocksapi_service.py", "source_location": "L10", "id": "service_stocksapi_service_mcpdetectmiddleware", - "community": 59, + "community": 536, "norm_label": "mcpdetectmiddleware" }, { @@ -4953,7 +4953,7 @@ "source_file": "main/service/stocksapi_service.py", "source_location": "L11", "id": "service_stocksapi_service_mcpdetectmiddleware_init", - "community": 59, + "community": 536, "norm_label": ".__init__()" }, { @@ -4962,7 +4962,7 @@ "source_file": "main/service/stocksapi_service.py", "source_location": "L14", "id": "service_stocksapi_service_mcpdetectmiddleware_call", - "community": 59, + "community": 536, "norm_label": ".__call__()" }, { @@ -4971,7 +4971,7 @@ "source_file": "main/service/stocksapi_service.py", "source_location": "L25", "id": "service_stocksapi_service_stocksapiservice", - "community": 59, + "community": 536, "norm_label": "stocksapiservice" }, { @@ -4980,7 +4980,7 @@ "source_file": "main/service/stocksapi_service.py", "source_location": "L27", "id": "service_stocksapi_service_initialize", - "community": 59, + "community": 536, "norm_label": "initialize()" }, { @@ -5025,7 +5025,7 @@ "source_file": "main/utils/connectivity.py", "source_location": "L1", "id": "main_utils_connectivity_py", - "community": 59, + "community": 541, "norm_label": "connectivity.py" }, { @@ -5034,7 +5034,7 @@ "source_file": "main/utils/connectivity.py", "source_location": "L11", "id": "utils_connectivity_checkdatabaseconnection", - "community": 59, + "community": 541, "norm_label": "checkdatabaseconnection()" }, { @@ -5133,7 +5133,7 @@ "source_file": "main/utils/http_session.py", "source_location": "L1", "id": "main_utils_http_session_py", - "community": 522, + "community": 137, "norm_label": "http_session.py" }, { @@ -5142,7 +5142,7 @@ "source_file": "main/utils/http_session.py", "source_location": "L8", "id": "utils_http_session_getsession", - "community": 522, + "community": 137, "norm_label": "getsession()" }, { @@ -5205,7 +5205,7 @@ "source_file": "main/utils/migrator.py", "source_location": "L1", "id": "main_utils_migrator_py", - "community": 59, + "community": 541, "norm_label": "migrator.py" }, { @@ -5214,7 +5214,7 @@ "source_file": "main/utils/migrator.py", "source_location": "L8", "id": "utils_migrator_runmigrations", - "community": 59, + "community": 541, "norm_label": "runmigrations()" }, { @@ -5268,7 +5268,7 @@ "source_file": "main/utils/roles.py", "source_location": "L5", "id": "utils_roles_permission", - "community": 140, + "community": 498, "norm_label": "permission" }, { @@ -5286,7 +5286,7 @@ "source_file": "main/utils/roles.py", "source_location": "L13", "id": "utils_roles_all", - "community": 59, + "community": 131, "norm_label": "all()" }, { @@ -5349,7 +5349,7 @@ "source_file": "main/utils/service_manager.py", "source_location": "L1", "id": "main_utils_service_manager_py", - "community": 59, + "community": 536, "norm_label": "service_manager.py" }, { @@ -5358,7 +5358,7 @@ "source_file": "main/utils/service_manager.py", "source_location": "L19", "id": "utils_service_manager_getapp", - "community": 59, + "community": 536, "norm_label": "getapp()" }, { @@ -5367,7 +5367,7 @@ "source_file": "main/utils/service_manager.py", "source_location": "L43", "id": "utils_service_manager_runall", - "community": 59, + "community": 536, "norm_label": "runall()" }, { @@ -5376,7 +5376,7 @@ "source_file": "main/utils/models/loader.py", "source_location": "L1", "id": "main_utils_models_loader_py", - "community": 562, + "community": 84, "norm_label": "loader.py" }, { @@ -5385,7 +5385,7 @@ "source_file": "main/utils/models/loader.py", "source_location": "L12", "id": "models_loader_getembeddingmodel", - "community": 562, + "community": 84, "norm_label": "getembeddingmodel()" }, { @@ -6027,87 +6027,6 @@ "community": 163, "norm_label": "license" }, - { - "label": "SWARMS.md", - "file_type": "document", - "source_file": "SWARMS.md", - "source_location": "L1", - "id": "swarms_md", - "community": 263, - "norm_label": "swarms.md" - }, - { - "label": "SWARMS.md \u2014 subagent swarm playbook (OpenCode / Hermes)", - "file_type": "document", - "source_file": "SWARMS.md", - "source_location": "L1", - "id": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", - "community": 263, - "norm_label": "swarms.md \u2014 subagent swarm playbook (opencode / hermes)" - }, - { - "label": "1. Prime owns the goal, lanes own the work", - "file_type": "document", - "source_file": "SWARMS.md", - "source_location": "L6", - "id": "server_swarms_1_prime_owns_the_goal_lanes_own_the_work", - "community": 263, - "norm_label": "1. prime owns the goal, lanes own the work" - }, - { - "label": "2. Dispatch: `delegate()`, one per lane, one turn", - "file_type": "document", - "source_file": "SWARMS.md", - "source_location": "L12", - "id": "server_swarms_2_dispatch_delegate_one_per_lane_one_turn", - "community": 263, - "norm_label": "2. dispatch: `delegate()`, one per lane, one turn" - }, - { - "label": "3. Delegate toolsets vary \u2014 verify each lane", - "file_type": "document", - "source_file": "SWARMS.md", - "source_location": "L20", - "id": "server_swarms_3_delegate_toolsets_vary_verify_each_lane", - "community": 263, - "norm_label": "3. delegate toolsets vary \u2014 verify each lane" - }, - { - "label": "4. Trust nothing \u2014 verify everything", - "file_type": "document", - "source_file": "SWARMS.md", - "source_location": "L26", - "id": "server_swarms_4_trust_nothing_verify_everything", - "community": 263, - "norm_label": "4. trust nothing \u2014 verify everything" - }, - { - "label": "5. Windows PowerShell survival", - "file_type": "document", - "source_file": "SWARMS.md", - "source_location": "L33", - "id": "server_swarms_5_windows_powershell_survival", - "community": 263, - "norm_label": "5. windows powershell survival" - }, - { - "label": "6. Finish per lane, not per swarm", - "file_type": "document", - "source_file": "SWARMS.md", - "source_location": "L39", - "id": "server_swarms_6_finish_per_lane_not_per_swarm", - "community": 263, - "norm_label": "6. finish per lane, not per swarm" - }, - { - "label": "7. Standing bans (this repo)", - "file_type": "document", - "source_file": "SWARMS.md", - "source_location": "L45", - "id": "server_swarms_7_standing_bans_this_repo", - "community": 263, - "norm_label": "7. standing bans (this repo)" - }, { "label": "TODO.md", "file_type": "document", @@ -6172,37 +6091,64 @@ "norm_label": "authentication management" }, { - "label": "Usage", + "label": "Token & session lifetime", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L9", - "id": "docs_authentication_usage", + "source_location": "L5", + "id": "docs_authentication_token_session_lifetime", "community": 41, - "norm_label": "usage" + "norm_label": "token & session lifetime" }, { - "label": "code:env (#)", + "label": "Token extraction order", "file_type": "document", "source_file": "docs/authentication.md", "source_location": "L11", - "id": "docs_authentication_codeblock_1", + "id": "docs_authentication_token_extraction_order", "community": 41, - "norm_label": "code:env (#)" + "norm_label": "token extraction order" }, { - "label": "Roles and Permissions", + "label": "Cookie handling (conditional Secure)", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L39", + "source_location": "L21", + "id": "docs_authentication_cookie_handling_conditional_secure", + "community": 41, + "norm_label": "cookie handling (conditional secure)" + }, + { + "label": "Session data model (family-only)", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L30", + "id": "docs_authentication_session_data_model_family_only", + "community": 41, + "norm_label": "session data model (family-only)" + }, + { + "label": "Roles and permissions", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L47", "id": "docs_authentication_roles_and_permissions", "community": 41, "norm_label": "roles and permissions" }, { - "label": "API Endpoints", + "label": "Rate limits", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L49", + "source_location": "L61", + "id": "docs_authentication_rate_limits", + "community": 41, + "norm_label": "rate limits" + }, + { + "label": "API endpoints", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L72", "id": "docs_authentication_api_endpoints", "community": 41, "norm_label": "api endpoints" @@ -6211,7 +6157,7 @@ "label": "Health Check", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L51", + "source_location": "L74", "id": "docs_authentication_health_check", "community": 41, "norm_label": "health check" @@ -6220,8 +6166,8 @@ "label": "code:bash (curl http://localhost:3200/auth/health)", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L52", - "id": "docs_authentication_codeblock_2", + "source_location": "L76", + "id": "docs_authentication_codeblock_1", "community": 41, "norm_label": "code:bash (curl http://localhost:3200/auth/health)" }, @@ -6229,7 +6175,7 @@ "label": "User Registration", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L57", + "source_location": "L80", "id": "docs_authentication_user_registration", "community": 41, "norm_label": "user registration" @@ -6238,8 +6184,8 @@ "label": "code:bash (curl -X POST \"http://localhost:3200/auth/register\" \\)", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L59", - "id": "docs_authentication_codeblock_3", + "source_location": "L84", + "id": "docs_authentication_codeblock_2", "community": 41, "norm_label": "code:bash (curl -x post \"http://localhost:3200/auth/register\" \\)" }, @@ -6247,7 +6193,7 @@ "label": "User Login", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L65", + "source_location": "L92", "id": "docs_authentication_user_login", "community": 41, "norm_label": "user login" @@ -6256,34 +6202,16 @@ "label": "code:bash (curl -X POST \"http://localhost:3200/auth/login\" \\)", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L67", - "id": "docs_authentication_codeblock_4", + "source_location": "L94", + "id": "docs_authentication_codeblock_3", "community": 41, "norm_label": "code:bash (curl -x post \"http://localhost:3200/auth/login\" \\)" }, - { - "label": "Profile (Me)", - "file_type": "document", - "source_file": "docs/authentication.md", - "source_location": "L77", - "id": "docs_authentication_profile_me", - "community": 41, - "norm_label": "profile (me)" - }, - { - "label": "code:bash (curl -X GET \"http://localhost:3200/auth/me\" \\)", - "file_type": "document", - "source_file": "docs/authentication.md", - "source_location": "L79", - "id": "docs_authentication_codeblock_5", - "community": 41, - "norm_label": "code:bash (curl -x get \"http://localhost:3200/auth/me\" \\)" - }, { "label": "Logout", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L84", + "source_location": "L102", "id": "docs_authentication_logout", "community": 41, "norm_label": "logout" @@ -6292,8 +6220,8 @@ "label": "code:bash (curl -X POST \"http://localhost:3200/auth/logout\" \\)", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L86", - "id": "docs_authentication_codeblock_6", + "source_location": "L104", + "id": "docs_authentication_codeblock_4", "community": 41, "norm_label": "code:bash (curl -x post \"http://localhost:3200/auth/logout\" \\)" }, @@ -6301,70 +6229,52 @@ "label": "Google OAuth2 Login", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L94", + "source_location": "L111", "id": "docs_authentication_google_oauth2_login", "community": 41, "norm_label": "google oauth2 login" }, { - "label": "code:bash (# Redirect your browser to:)", + "label": "code:bash (# Browser redirect; redirect_url optional, else Referer head)", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L98", - "id": "docs_authentication_codeblock_7", - "community": 41, - "norm_label": "code:bash (# redirect your browser to:)" - }, - { - "label": "code:bash (GET http://localhost:3200/auth/google)", - "file_type": "document", - "source_file": "docs/authentication.md", - "source_location": "L104", - "id": "docs_authentication_codeblock_8", + "source_location": "L113", + "id": "docs_authentication_codeblock_5", "community": 41, - "norm_label": "code:bash (get http://localhost:3200/auth/google)" + "norm_label": "code:bash (# browser redirect; redirect_url optional, else referer head)" }, { - "label": "Google Callback", + "label": "Google Callback (cookie-only)", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L108", - "id": "docs_authentication_google_callback", + "source_location": "L120", + "id": "docs_authentication_google_callback_cookie_only", "community": 41, - "norm_label": "google callback" + "norm_label": "google callback (cookie-only)" }, { - "label": "Security Features", + "label": "Security features", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L117", + "source_location": "L129", "id": "docs_authentication_security_features", "community": 41, "norm_label": "security features" }, { - "label": "Device Detection", - "file_type": "document", - "source_file": "docs/authentication.md", - "source_location": "L130", - "id": "docs_authentication_device_detection", - "community": 41, - "norm_label": "device detection" - }, - { - "label": "Session Management", + "label": "Not implemented", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L144", - "id": "docs_authentication_session_management", + "source_location": "L138", + "id": "docs_authentication_not_implemented", "community": 41, - "norm_label": "session management" + "norm_label": "not implemented" }, { "label": "Workflow", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L154", + "source_location": "L142", "id": "docs_authentication_workflow", "community": 41, "norm_label": "workflow" @@ -6373,8 +6283,8 @@ "label": "code:mermaid (graph TD)", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L156", - "id": "docs_authentication_codeblock_9", + "source_location": "L144", + "id": "docs_authentication_codeblock_6", "community": 41, "norm_label": "code:mermaid (graph td)" }, @@ -6382,90 +6292,81 @@ "label": "License", "file_type": "document", "source_file": "docs/authentication.md", - "source_location": "L187", + "source_location": "L172", "id": "docs_authentication_license", "community": 41, "norm_label": "license" }, { - "label": "prometheus.md", + "label": "orunmila.md", "file_type": "document", - "source_file": "docs/prometheus.md", + "source_file": "docs/orunmila.md", "source_location": "L1", - "id": "docs_prometheus_md", - "community": 156, - "norm_label": "prometheus.md" + "id": "docs_orunmila_md", + "community": 490, + "norm_label": "orunmila.md" }, { - "label": "Prometheus", + "label": "Orunmila", "file_type": "document", - "source_file": "docs/prometheus.md", + "source_file": "docs/orunmila.md", "source_location": "L1", - "id": "docs_prometheus_prometheus", - "community": 156, - "norm_label": "prometheus" + "id": "docs_orunmila_orunmila", + "community": 490, + "norm_label": "orunmila" }, { "label": "Usage", "file_type": "document", - "source_file": "docs/prometheus.md", - "source_location": "L9", - "id": "docs_prometheus_usage", - "community": 156, + "source_file": "docs/orunmila.md", + "source_location": "L7", + "id": "docs_orunmila_usage", + "community": 490, "norm_label": "usage" }, { - "label": "code:env (#)", + "label": "code:env (PROMETHEUS_ENABLED=TRUE)", "file_type": "document", - "source_file": "docs/prometheus.md", + "source_file": "docs/orunmila.md", "source_location": "L11", - "id": "docs_prometheus_codeblock_1", - "community": 156, - "norm_label": "code:env (#)" + "id": "docs_orunmila_codeblock_1", + "community": 490, + "norm_label": "code:env (prometheus_enabled=true)" }, { - "label": "code:bash (python __init__.py)", + "label": "code:bash (python run.py)", "file_type": "document", - "source_file": "docs/prometheus.md", - "source_location": "L51", - "id": "docs_prometheus_codeblock_2", - "community": 156, - "norm_label": "code:bash (python __init__.py)" + "source_file": "docs/orunmila.md", + "source_location": "L56", + "id": "docs_orunmila_codeblock_2", + "community": 490, + "norm_label": "code:bash (python run.py)" }, { "label": "Workflow", "file_type": "document", - "source_file": "docs/prometheus.md", - "source_location": "L55", - "id": "docs_prometheus_workflow", - "community": 156, + "source_file": "docs/orunmila.md", + "source_location": "L60", + "id": "docs_orunmila_workflow", + "community": 490, "norm_label": "workflow" }, - { - "label": "code:mermaid (graph TD)", - "file_type": "document", - "source_file": "docs/prometheus.md", - "source_location": "L57", - "id": "docs_prometheus_codeblock_3", - "community": 156, - "norm_label": "code:mermaid (graph td)" - }, { "label": "API Endpoints", "file_type": "document", - "source_file": "docs/prometheus.md", - "source_location": "L67", - "id": "docs_prometheus_api_endpoints", - "community": 156, + "source_file": "docs/orunmila.md", + "source_location": "L74", + "id": "docs_orunmila_api_endpoints", + "community": 490, "norm_label": "api endpoints" }, { "label": "License", "file_type": "document", - "source_file": "docs/prometheus.md", - "source_location": "L74", - "id": "docs_prometheus_license", - "community": 156, + "source_file": "docs/orunmila.md", + "source_location": "L89", + "id": "docs_orunmila_license", + "community": 490, "norm_label": "license" }, { @@ -6478,148 +6379,58 @@ "norm_label": "scraper_b3.md" }, { - "label": "Brazilian Stocks Market Scraper", + "label": "B3 Market Scraper", "file_type": "document", "source_file": "docs/scraper_b3.md", "source_location": "L1", - "id": "docs_scraper_b3_brazilian_stocks_market_scraper", + "id": "docs_scraper_b3_b3_market_scraper", "community": 83, - "norm_label": "brazilian stocks market scraper" + "norm_label": "b3 market scraper" }, { - "label": "Usage", + "label": "Sources (6)", "file_type": "document", "source_file": "docs/scraper_b3.md", "source_location": "L5", - "id": "docs_scraper_b3_usage", - "community": 83, - "norm_label": "usage" - }, - { - "label": "code:env (#)", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L8", - "id": "docs_scraper_b3_codeblock_1", - "community": 83, - "norm_label": "code:env (#)" - }, - { - "label": "Output Format", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L27", - "id": "docs_scraper_b3_output_format", - "community": 83, - "norm_label": "output format" - }, - { - "label": "MySQL Table (b3_stocks)", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L29", - "id": "docs_scraper_b3_mysql_table_b3_stocks", - "community": 83, - "norm_label": "mysql table (b3_stocks)" - }, - { - "label": "Sample Record", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L38", - "id": "docs_scraper_b3_sample_record", - "community": 83, - "norm_label": "sample record" - }, - { - "label": "code:json ({)", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L40", - "id": "docs_scraper_b3_codeblock_2", - "community": 83, - "norm_label": "code:json ({)" - }, - { - "label": "Xang\u00f4", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L55", - "id": "docs_scraper_b3_xang\u00f4", - "community": 83, - "norm_label": "xango" - }, - { - "label": "Global Score Function", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L60", - "id": "docs_scraper_b3_global_score_function", - "community": 83, - "norm_label": "global score function" - }, - { - "label": "Engines", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L69", - "id": "docs_scraper_b3_engines", - "community": 83, - "norm_label": "engines" - }, - { - "label": "Profit Quality Gate ($M_{profit}$)", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L71", - "id": "docs_scraper_b3_profit_quality_gate_m_profit", + "id": "docs_scraper_b3_sources_6", "community": 83, - "norm_label": "profit quality gate ($m_{profit}$)" + "norm_label": "sources (6)" }, { - "label": "Fundamental Engine ($\\Phi$)", + "label": "Scheduling & config (`config.py:77-81`, `scraper_service.py:23-36`)", "file_type": "document", "source_file": "docs/scraper_b3.md", - "source_location": "L76", - "id": "docs_scraper_b3_fundamental_engine_phi", - "community": 83, - "norm_label": "fundamental engine ($\\phi$)" - }, - { - "label": "Risk-Quality Engine ($\\Omega$)", - "file_type": "document", - "source_file": "docs/scraper_b3.md", - "source_location": "L89", - "id": "docs_scraper_b3_risk_quality_engine_omega", + "source_location": "L19", + "id": "docs_scraper_b3_scheduling_config_config_py_77_81_scraper_service_py_23_36", "community": 83, - "norm_label": "risk-quality engine ($\\omega$)" + "norm_label": "scheduling & config (`config.py:77-81`, `scraper_service.py:23-36`)" }, { - "label": "Constraint Engine ($\\Lambda$)", + "label": "code:env (SCRAPER_ENABLED=FALSE # default False)", "file_type": "document", "source_file": "docs/scraper_b3.md", - "source_location": "L101", - "id": "docs_scraper_b3_constraint_engine_lambda", + "source_location": "L21", + "id": "docs_scraper_b3_codeblock_1", "community": 83, - "norm_label": "constraint engine ($\\lambda$)" + "norm_label": "code:env (scraper_enabled=false # default false)" }, { - "label": "Configuration Parameters", + "label": "XANGO score (`main/app/scraper_b3/xango.py`)", "file_type": "document", "source_file": "docs/scraper_b3.md", - "source_location": "L113", - "id": "docs_scraper_b3_configuration_parameters", + "source_location": "L31", + "id": "docs_scraper_b3_xango_score_main_app_scraper_b3_xango_py", "community": 83, - "norm_label": "configuration parameters" + "norm_label": "xango score (`main/app/scraper_b3/xango.py`)" }, { - "label": "License", + "label": "Outputs", "file_type": "document", "source_file": "docs/scraper_b3.md", - "source_location": "L131", - "id": "docs_scraper_b3_license", + "source_location": "L41", + "id": "docs_scraper_b3_outputs", "community": 83, - "norm_label": "license" + "norm_label": "outputs" }, { "label": "stocks_api.md", @@ -6649,19 +6460,28 @@ "norm_label": "usage" }, { - "label": "code:env (#)", + "label": "code:env (STOCKSAPI_ENABLED=TRUE)", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L9", + "source_location": "L11", "id": "docs_stocks_api_codeblock_1", "community": 65, - "norm_label": "code:env (#)" + "norm_label": "code:env (stocksapi_enabled=true)" + }, + { + "label": "Auth", + "file_type": "document", + "source_file": "docs/stocks_api.md", + "source_location": "L22", + "id": "docs_stocks_api_auth", + "community": 65, + "norm_label": "auth" }, { "label": "API Endpoints", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L32", + "source_location": "L30", "id": "docs_stocks_api_api_endpoints", "community": 65, "norm_label": "api endpoints" @@ -6670,7 +6490,7 @@ "label": "Health Check", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L34", + "source_location": "L32", "id": "docs_stocks_api_health_check", "community": 65, "norm_label": "health check" @@ -6679,106 +6499,115 @@ "label": "code:bash (curl http://localhost:3200/stocks/health)", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L35", + "source_location": "L34", "id": "docs_stocks_api_codeblock_2", "community": 65, "norm_label": "code:bash (curl http://localhost:3200/stocks/health)" }, { - "label": "API Key Verification", + "label": "Field Discovery", "file_type": "document", "source_file": "docs/stocks_api.md", "source_location": "L40", - "id": "docs_stocks_api_api_key_verification", + "id": "docs_stocks_api_field_discovery", "community": 65, - "norm_label": "api key verification" + "norm_label": "field discovery" }, { - "label": "code:bash (curl -H \"X-API-Key: YOUR_KEY\" http://localhost:3200/stocks/k)", + "label": "code:bash (curl http://localhost:3200/stocks/fields)", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L41", + "source_location": "L42", "id": "docs_stocks_api_codeblock_3", "community": 65, - "norm_label": "code:bash (curl -h \"x-api-key: your_key\" http://localhost:3200/stocks/k)" + "norm_label": "code:bash (curl http://localhost:3200/stocks/fields)" }, { - "label": "Key Management", + "label": "Historical Data", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L45", - "id": "docs_stocks_api_key_management", + "source_location": "L48", + "id": "docs_stocks_api_historical_data", "community": 65, - "norm_label": "key management" + "norm_label": "historical data" }, { - "label": "code:bash (curl \"http://localhost:3200/stocks/key/generate?userId=1\")", + "label": "code:bash (curl -H \"X-API-Key: YOUR_KEY\" \"http://localhost:3200/stocks/)", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L47", + "source_location": "L50", "id": "docs_stocks_api_codeblock_4", "community": 65, - "norm_label": "code:bash (curl \"http://localhost:3200/stocks/key/generate?userid=1\")" + "norm_label": "code:bash (curl -h \"x-api-key: your_key\" \"http://localhost:3200/stocks/)" }, { - "label": "Historical Data", + "label": "Fundamental Data", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L53", - "id": "docs_stocks_api_historical_data", + "source_location": "L61", + "id": "docs_stocks_api_fundamental_data", "community": 65, - "norm_label": "historical data" + "norm_label": "fundamental data" }, { "label": "code:bash (curl -H \"X-API-Key: YOUR_KEY\" \"http://localhost:3200/stocks/)", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L55", + "source_location": "L63", "id": "docs_stocks_api_codeblock_5", "community": 65, "norm_label": "code:bash (curl -h \"x-api-key: your_key\" \"http://localhost:3200/stocks/)" }, { - "label": "code:block6 (DESPESAS, DIVIDENDOS, DY, LUCRO LIQUIDO, MARGEM BRUTA, MARGE)", + "label": "Cotations (10-year daily history)", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L68", + "source_location": "L74", + "id": "docs_stocks_api_cotations_10_year_daily_history", + "community": 65, + "norm_label": "cotations (10-year daily history)" + }, + { + "label": "code:bash (curl -H \"X-API-Key: YOUR_KEY\" \"http://localhost:3200/stocks/)", + "file_type": "document", + "source_file": "docs/stocks_api.md", + "source_location": "L76", "id": "docs_stocks_api_codeblock_6", "community": 65, - "norm_label": "code:block6 (despesas, dividendos, dy, lucro liquido, margem bruta, marge)" + "norm_label": "code:bash (curl -h \"x-api-key: your_key\" \"http://localhost:3200/stocks/)" }, { - "label": "Fundamental Data", + "label": "Live Price", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L72", - "id": "docs_stocks_api_fundamental_data", + "source_location": "L87", + "id": "docs_stocks_api_live_price", "community": 65, - "norm_label": "fundamental data" + "norm_label": "live price" }, { "label": "code:bash (curl -H \"X-API-Key: YOUR_KEY\" \"http://localhost:3200/stocks/)", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L74", + "source_location": "L89", "id": "docs_stocks_api_codeblock_7", "community": 65, "norm_label": "code:bash (curl -h \"x-api-key: your_key\" \"http://localhost:3200/stocks/)" }, { - "label": "code:block8 (NOME, TICKER, SETOR, SUBSETOR, SEGMENTO, SGR, TAG ALONG, INV)", + "label": "MCP (AI agent tools)", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L86", - "id": "docs_stocks_api_codeblock_8", + "source_location": "L98", + "id": "docs_stocks_api_mcp_ai_agent_tools", "community": 65, - "norm_label": "code:block8 (nome, ticker, setor, subsetor, segmento, sgr, tag along, inv)" + "norm_label": "mcp (ai agent tools)" }, { "label": "Response Format", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L90", + "source_location": "L104", "id": "docs_stocks_api_response_format", "community": 65, "norm_label": "response format" @@ -6787,16 +6616,25 @@ "label": "code:json ({)", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L94", - "id": "docs_stocks_api_codeblock_9", + "source_location": "L106", + "id": "docs_stocks_api_codeblock_8", "community": 65, "norm_label": "code:json ({)" }, + { + "label": "Architecture", + "file_type": "document", + "source_file": "docs/stocks_api.md", + "source_location": "L119", + "id": "docs_stocks_api_architecture", + "community": 65, + "norm_label": "architecture" + }, { "label": "License", "file_type": "document", "source_file": "docs/stocks_api.md", - "source_location": "L113", + "source_location": "L126", "id": "docs_stocks_api_license", "community": 65, "norm_label": "license" @@ -6820,7 +6658,7 @@ "norm_label": "user management" }, { - "label": "Roles and Permissions", + "label": "Roles and permissions", "file_type": "document", "source_file": "docs/user.md", "source_location": "L5", @@ -6829,10 +6667,10 @@ "norm_label": "roles and permissions" }, { - "label": "API Endpoints", + "label": "API endpoints", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L17", + "source_location": "L19", "id": "docs_user_api_endpoints", "community": 23, "norm_label": "api endpoints" @@ -6841,7 +6679,7 @@ "label": "Health Check", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L19", + "source_location": "L21", "id": "docs_user_health_check", "community": 23, "norm_label": "health check" @@ -6850,7 +6688,7 @@ "label": "code:bash (curl http://localhost:3200/user/health)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L20", + "source_location": "L23", "id": "docs_user_codeblock_1", "community": 23, "norm_label": "code:bash (curl http://localhost:3200/user/health)" @@ -6859,7 +6697,7 @@ "label": "Get Profile", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L25", + "source_location": "L29", "id": "docs_user_get_profile", "community": 23, "norm_label": "get profile" @@ -6868,61 +6706,16 @@ "label": "code:bash (curl -H \"Authorization: Bearer \" http://localhost:320)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L27", + "source_location": "L31", "id": "docs_user_codeblock_2", "community": 23, "norm_label": "code:bash (curl -h \"authorization: bearer \" http://localhost:320)" }, - { - "label": "code:json ({)", - "file_type": "document", - "source_file": "docs/user.md", - "source_location": "L31", - "id": "docs_user_codeblock_3", - "community": 23, - "norm_label": "code:json ({)" - }, - { - "label": "Upgrade to Developer Starter", - "file_type": "document", - "source_file": "docs/user.md", - "source_location": "L41", - "id": "docs_user_upgrade_to_developer_starter", - "community": 23, - "norm_label": "upgrade to developer starter" - }, - { - "label": "code:bash (curl -X POST -H \"Authorization: Bearer \" http://local)", - "file_type": "document", - "source_file": "docs/user.md", - "source_location": "L43", - "id": "docs_user_codeblock_4", - "community": 23, - "norm_label": "code:bash (curl -x post -h \"authorization: bearer \" http://local)" - }, - { - "label": "Upgrade to Developer Enterprise", - "file_type": "document", - "source_file": "docs/user.md", - "source_location": "L47", - "id": "docs_user_upgrade_to_developer_enterprise", - "community": 23, - "norm_label": "upgrade to developer enterprise" - }, - { - "label": "code:bash (curl -X POST -H \"Authorization: Bearer \" http://local)", - "file_type": "document", - "source_file": "docs/user.md", - "source_location": "L49", - "id": "docs_user_codeblock_5", - "community": 23, - "norm_label": "code:bash (curl -x post -h \"authorization: bearer \" http://local)" - }, { "label": "Admin Access", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L53", + "source_location": "L37", "id": "docs_user_admin_access", "community": 23, "norm_label": "admin access" @@ -6931,16 +6724,16 @@ "label": "code:bash (curl -H \"Authorization: Bearer \" http://localhost:320)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L55", - "id": "docs_user_codeblock_6", + "source_location": "L39", + "id": "docs_user_codeblock_3", "community": 23, "norm_label": "code:bash (curl -h \"authorization: bearer \" http://localhost:320)" }, { - "label": "Session Management", + "label": "Session management", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L59", + "source_location": "L45", "id": "docs_user_session_management", "community": 23, "norm_label": "session management" @@ -6949,26 +6742,26 @@ "label": "List All Sessions", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L63", + "source_location": "L51", "id": "docs_user_list_all_sessions", "community": 23, "norm_label": "list all sessions" }, { - "label": "code:bash (curl -H \"Authorization: Bearer \" http://localhost:320)", + "label": "code:bash (curl -H \"Authorization: Bearer \" \"http://localhost:32)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L65", - "id": "docs_user_codeblock_7", + "source_location": "L55", + "id": "docs_user_codeblock_4", "community": 23, - "norm_label": "code:bash (curl -h \"authorization: bearer \" http://localhost:320)" + "norm_label": "code:bash (curl -h \"authorization: bearer \" \"http://localhost:32)" }, { "label": "code:json ({)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L69", - "id": "docs_user_codeblock_8", + "source_location": "L59", + "id": "docs_user_codeblock_5", "community": 23, "norm_label": "code:json ({)" }, @@ -6976,7 +6769,7 @@ "label": "Get Current Session", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L92", + "source_location": "L79", "id": "docs_user_get_current_session", "community": 23, "norm_label": "get current session" @@ -6985,25 +6778,16 @@ "label": "code:bash (curl -H \"Authorization: Bearer \" http://localhost:320)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L94", - "id": "docs_user_codeblock_9", + "source_location": "L83", + "id": "docs_user_codeblock_6", "community": 23, "norm_label": "code:bash (curl -h \"authorization: bearer \" http://localhost:320)" }, - { - "label": "code:json ({)", - "file_type": "document", - "source_file": "docs/user.md", - "source_location": "L98", - "id": "docs_user_codeblock_10", - "community": 23, - "norm_label": "code:json ({)" - }, { "label": "Revoke a Session", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L114", + "source_location": "L89", "id": "docs_user_revoke_a_session", "community": 23, "norm_label": "revoke a session" @@ -7012,25 +6796,16 @@ "label": "code:bash (curl -X DELETE -H \"Authorization: Bearer \" http://loc)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L116", - "id": "docs_user_codeblock_11", + "source_location": "L91", + "id": "docs_user_codeblock_7", "community": 23, "norm_label": "code:bash (curl -x delete -h \"authorization: bearer \" http://loc)" }, - { - "label": "code:json ({)", - "file_type": "document", - "source_file": "docs/user.md", - "source_location": "L120", - "id": "docs_user_codeblock_12", - "community": 23, - "norm_label": "code:json ({)" - }, { "label": "Revoke All Sessions", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L127", + "source_location": "L97", "id": "docs_user_revoke_all_sessions", "community": 23, "norm_label": "revoke all sessions" @@ -7039,8 +6814,8 @@ "label": "code:bash (curl -X POST -H \"Authorization: Bearer \" http://local)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L129", - "id": "docs_user_codeblock_13", + "source_location": "L101", + "id": "docs_user_codeblock_8", "community": 23, "norm_label": "code:bash (curl -x post -h \"authorization: bearer \" http://local)" }, @@ -7048,34 +6823,43 @@ "label": "code:json ({)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L133", - "id": "docs_user_codeblock_14", + "source_location": "L105", + "id": "docs_user_codeblock_9", "community": 23, "norm_label": "code:json ({)" }, { - "label": "Permission System", + "label": "API keys (Stocks API)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L140", - "id": "docs_user_permission_system", + "source_location": "L112", + "id": "docs_user_api_keys_stocks_api", "community": 23, - "norm_label": "permission system" + "norm_label": "api keys (stocks api)" }, { - "label": "code:python (Permission.VIEW_PROFILE # View own profile)", + "label": "Rate limits (related services)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L144", - "id": "docs_user_codeblock_15", + "source_location": "L123", + "id": "docs_user_rate_limits_related_services", "community": 23, - "norm_label": "code:python (permission.view_profile # view own profile)" + "norm_label": "rate limits (related services)" + }, + { + "label": "Not implemented", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L135", + "id": "docs_user_not_implemented", + "community": 23, + "norm_label": "not implemented" }, { "label": "Workflow", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L156", + "source_location": "L139", "id": "docs_user_workflow", "community": 23, "norm_label": "workflow" @@ -7084,8 +6868,8 @@ "label": "code:mermaid (graph TD)", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L158", - "id": "docs_user_codeblock_16", + "source_location": "L141", + "id": "docs_user_codeblock_10", "community": 23, "norm_label": "code:mermaid (graph td)" }, @@ -7093,7 +6877,7 @@ "label": "License", "file_type": "document", "source_file": "docs/user.md", - "source_location": "L177", + "source_location": "L163", "id": "docs_user_license", "community": 23, "norm_label": "license" @@ -8814,7 +8598,7 @@ "source_file": "docs/superpowers/plans/2026-09-04-wallet-management.md", "source_location": "L166", "id": "plans_2026_09_04_wallet_management_task_2_alembic_migration_for_wallet_tables", - "community": 132, + "community": 569, "norm_label": "task 2: alembic migration for wallet tables" }, { @@ -8823,7 +8607,7 @@ "source_file": "docs/superpowers/plans/2026-09-04-wallet-management.md", "source_location": "L189", "id": "plans_2026_09_04_wallet_management_codeblock_6", - "community": 132, + "community": 569, "norm_label": "code:python (\"\"\"add wallet_holdings and wallet_lots tables)" }, { @@ -8832,7 +8616,7 @@ "source_file": "docs/superpowers/plans/2026-09-04-wallet-management.md", "source_location": "L248", "id": "plans_2026_09_04_wallet_management_codeblock_7", - "community": 132, + "community": 569, "norm_label": "code:python (import main.models.wallet)" }, { @@ -8841,7 +8625,7 @@ "source_file": "docs/superpowers/plans/2026-09-04-wallet-management.md", "source_location": "L262", "id": "plans_2026_09_04_wallet_management_codeblock_8", - "community": 132, + "community": 569, "norm_label": "code:bash (git add migrations/versions/wallet_tables_20260904_add_walle)" }, { @@ -8850,7 +8634,7 @@ "source_file": "docs/superpowers/plans/2026-09-04-wallet-management.md", "source_location": "L269", "id": "plans_2026_09_04_wallet_management_task_3_pure_derivation_math", - "community": 491, + "community": 132, "norm_label": "task 3: pure derivation math" }, { @@ -8859,7 +8643,7 @@ "source_file": "docs/superpowers/plans/2026-09-04-wallet-management.md", "source_location": "L281", "id": "plans_2026_09_04_wallet_management_codeblock_9", - "community": 491, + "community": 132, "norm_label": "code:python (from datetime import date)" }, { @@ -8868,7 +8652,7 @@ "source_file": "docs/superpowers/plans/2026-09-04-wallet-management.md", "source_location": "L325", "id": "plans_2026_09_04_wallet_management_codeblock_10", - "community": 491, + "community": 132, "norm_label": "code:python (from dataclasses import dataclass)" }, { @@ -8877,7 +8661,7 @@ "source_file": "docs/superpowers/plans/2026-09-04-wallet-management.md", "source_location": "L384", "id": "plans_2026_09_04_wallet_management_codeblock_11", - "community": 491, + "community": 132, "norm_label": "code:bash (git add main/app/wallet/__init__.py main/app/wallet/math.py )" }, { @@ -9834,6 +9618,492 @@ "community": 94, "norm_label": "spec self-review" }, + { + "label": "Upgrade to Developer Starter", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L41", + "community": 23, + "norm_label": "upgrade to developer starter", + "id": "docs_user_upgrade_to_developer_starter" + }, + { + "label": "Upgrade to Developer Enterprise", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L47", + "community": 23, + "norm_label": "upgrade to developer enterprise", + "id": "docs_user_upgrade_to_developer_enterprise" + }, + { + "label": "code:bash (curl -X DELETE -H \"Authorization: Bearer \" http://loc)", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L116", + "community": 23, + "norm_label": "code:bash (curl -x delete -h \"authorization: bearer \" http://loc)", + "id": "docs_user_codeblock_11" + }, + { + "label": "code:json ({)", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L120", + "community": 23, + "norm_label": "code:json ({)", + "id": "docs_user_codeblock_12" + }, + { + "label": "code:bash (curl -X POST -H \"Authorization: Bearer \" http://local)", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L129", + "community": 23, + "norm_label": "code:bash (curl -x post -h \"authorization: bearer \" http://local)", + "id": "docs_user_codeblock_13" + }, + { + "label": "code:json ({)", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L133", + "community": 23, + "norm_label": "code:json ({)", + "id": "docs_user_codeblock_14" + }, + { + "label": "Permission System", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L140", + "community": 23, + "norm_label": "permission system", + "id": "docs_user_permission_system" + }, + { + "label": "code:python (Permission.VIEW_PROFILE # View own profile)", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L144", + "community": 23, + "norm_label": "code:python (permission.view_profile # view own profile)", + "id": "docs_user_codeblock_15" + }, + { + "label": "code:mermaid (graph TD)", + "file_type": "document", + "source_file": "docs/user.md", + "source_location": "L158", + "community": 23, + "norm_label": "code:mermaid (graph td)", + "id": "docs_user_codeblock_16" + }, + { + "label": "Usage", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L9", + "community": 41, + "norm_label": "usage", + "id": "docs_authentication_usage" + }, + { + "label": "Profile (Me)", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L77", + "community": 41, + "norm_label": "profile (me)", + "id": "docs_authentication_profile_me" + }, + { + "label": "code:bash (# Redirect your browser to:)", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L98", + "community": 41, + "norm_label": "code:bash (# redirect your browser to:)", + "id": "docs_authentication_codeblock_7" + }, + { + "label": "code:bash (GET http://localhost:3200/auth/google)", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L104", + "community": 41, + "norm_label": "code:bash (get http://localhost:3200/auth/google)", + "id": "docs_authentication_codeblock_8" + }, + { + "label": "Google Callback", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L108", + "community": 41, + "norm_label": "google callback", + "id": "docs_authentication_google_callback" + }, + { + "label": "Device Detection", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L130", + "community": 41, + "norm_label": "device detection", + "id": "docs_authentication_device_detection" + }, + { + "label": "Session Management", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L144", + "community": 41, + "norm_label": "session management", + "id": "docs_authentication_session_management" + }, + { + "label": "code:mermaid (graph TD)", + "file_type": "document", + "source_file": "docs/authentication.md", + "source_location": "L156", + "community": 41, + "norm_label": "code:mermaid (graph td)", + "id": "docs_authentication_codeblock_9" + }, + { + "label": "code:mermaid (graph TD)", + "file_type": "document", + "source_file": "docs/orunmila.md", + "source_location": "L55", + "community": 490, + "norm_label": "code:mermaid (graph td)", + "id": "docs_orunmila_codeblock_3" + }, + { + "label": "API Key Verification", + "file_type": "document", + "source_file": "docs/stocks_api.md", + "source_location": "L40", + "community": 65, + "norm_label": "api key verification", + "id": "docs_stocks_api_api_key_verification" + }, + { + "label": "Key Management", + "file_type": "document", + "source_file": "docs/stocks_api.md", + "source_location": "L45", + "community": 65, + "norm_label": "key management", + "id": "docs_stocks_api_key_management" + }, + { + "label": "code:json ({)", + "file_type": "document", + "source_file": "docs/stocks_api.md", + "source_location": "L94", + "community": 65, + "norm_label": "code:json ({)", + "id": "docs_stocks_api_codeblock_9" + }, + { + "label": "Brazilian Stocks Market Scraper", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L1", + "community": 83, + "norm_label": "brazilian stocks market scraper", + "id": "docs_scraper_b3_brazilian_stocks_market_scraper" + }, + { + "label": "Usage", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L5", + "community": 83, + "norm_label": "usage", + "id": "docs_scraper_b3_usage" + }, + { + "label": "Output Format", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L27", + "community": 83, + "norm_label": "output format", + "id": "docs_scraper_b3_output_format" + }, + { + "label": "MySQL Table (b3_stocks)", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L29", + "community": 83, + "norm_label": "mysql table (b3_stocks)", + "id": "docs_scraper_b3_mysql_table_b3_stocks" + }, + { + "label": "Sample Record", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L38", + "community": 83, + "norm_label": "sample record", + "id": "docs_scraper_b3_sample_record" + }, + { + "label": "code:json ({)", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L40", + "community": 83, + "norm_label": "code:json ({)", + "id": "docs_scraper_b3_codeblock_2" + }, + { + "label": "Xang\u00f4", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L55", + "community": 83, + "norm_label": "xango", + "id": "docs_scraper_b3_xang\u00f4" + }, + { + "label": "Global Score Function", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L60", + "community": 83, + "norm_label": "global score function", + "id": "docs_scraper_b3_global_score_function" + }, + { + "label": "Engines", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L69", + "community": 83, + "norm_label": "engines", + "id": "docs_scraper_b3_engines" + }, + { + "label": "Profit Quality Gate ($M_{profit}$)", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L71", + "community": 83, + "norm_label": "profit quality gate ($m_{profit}$)", + "id": "docs_scraper_b3_profit_quality_gate_m_profit" + }, + { + "label": "Fundamental Engine ($\\Phi$)", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L76", + "community": 83, + "norm_label": "fundamental engine ($\\phi$)", + "id": "docs_scraper_b3_fundamental_engine_phi" + }, + { + "label": "Risk-Quality Engine ($\\Omega$)", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L89", + "community": 83, + "norm_label": "risk-quality engine ($\\omega$)", + "id": "docs_scraper_b3_risk_quality_engine_omega" + }, + { + "label": "Constraint Engine ($\\Lambda$)", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L101", + "community": 83, + "norm_label": "constraint engine ($\\lambda$)", + "id": "docs_scraper_b3_constraint_engine_lambda" + }, + { + "label": "Configuration Parameters", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L113", + "community": 83, + "norm_label": "configuration parameters", + "id": "docs_scraper_b3_configuration_parameters" + }, + { + "label": "License", + "file_type": "document", + "source_file": "docs/scraper_b3.md", + "source_location": "L131", + "community": 83, + "norm_label": "license", + "id": "docs_scraper_b3_license" + }, + { + "label": "SWARMS.md", + "file_type": "document", + "source_file": "SWARMS.md", + "source_location": "L1", + "community": 263, + "norm_label": "swarms.md", + "id": "swarms_md" + }, + { + "label": "SWARMS.md \u2014 subagent swarm playbook (OpenCode / Hermes)", + "file_type": "document", + "source_file": "SWARMS.md", + "source_location": "L1", + "community": 263, + "norm_label": "swarms.md \u2014 subagent swarm playbook (opencode / hermes)", + "id": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes" + }, + { + "label": "1. Prime owns the goal, lanes own the work", + "file_type": "document", + "source_file": "SWARMS.md", + "source_location": "L6", + "community": 263, + "norm_label": "1. prime owns the goal, lanes own the work", + "id": "server_swarms_1_prime_owns_the_goal_lanes_own_the_work" + }, + { + "label": "2. Dispatch: `delegate()`, one per lane, one turn", + "file_type": "document", + "source_file": "SWARMS.md", + "source_location": "L12", + "community": 263, + "norm_label": "2. dispatch: `delegate()`, one per lane, one turn", + "id": "server_swarms_2_dispatch_delegate_one_per_lane_one_turn" + }, + { + "label": "3. Delegate toolsets vary \u2014 verify each lane", + "file_type": "document", + "source_file": "SWARMS.md", + "source_location": "L20", + "community": 263, + "norm_label": "3. delegate toolsets vary \u2014 verify each lane", + "id": "server_swarms_3_delegate_toolsets_vary_verify_each_lane" + }, + { + "label": "4. Trust nothing \u2014 verify everything", + "file_type": "document", + "source_file": "SWARMS.md", + "source_location": "L26", + "community": 263, + "norm_label": "4. trust nothing \u2014 verify everything", + "id": "server_swarms_4_trust_nothing_verify_everything" + }, + { + "label": "5. Windows PowerShell survival", + "file_type": "document", + "source_file": "SWARMS.md", + "source_location": "L33", + "community": 263, + "norm_label": "5. windows powershell survival", + "id": "server_swarms_5_windows_powershell_survival" + }, + { + "label": "6. Finish per lane, not per swarm", + "file_type": "document", + "source_file": "SWARMS.md", + "source_location": "L39", + "community": 263, + "norm_label": "6. finish per lane, not per swarm", + "id": "server_swarms_6_finish_per_lane_not_per_swarm" + }, + { + "label": "7. Standing bans (this repo)", + "file_type": "document", + "source_file": "SWARMS.md", + "source_location": "L45", + "community": 263, + "norm_label": "7. standing bans (this repo)", + "id": "server_swarms_7_standing_bans_this_repo" + }, + { + "label": "prometheus.md", + "file_type": "document", + "source_file": "docs/prometheus.md", + "source_location": "L1", + "community": 156, + "norm_label": "prometheus.md", + "id": "docs_prometheus_md" + }, + { + "label": "Prometheus", + "file_type": "document", + "source_file": "docs/prometheus.md", + "source_location": "L1", + "community": 156, + "norm_label": "prometheus", + "id": "docs_prometheus_prometheus" + }, + { + "label": "Usage", + "file_type": "document", + "source_file": "docs/prometheus.md", + "source_location": "L9", + "community": 156, + "norm_label": "usage", + "id": "docs_prometheus_usage" + }, + { + "label": "code:env (#)", + "file_type": "document", + "source_file": "docs/prometheus.md", + "source_location": "L11", + "community": 156, + "norm_label": "code:env (#)", + "id": "docs_prometheus_codeblock_1" + }, + { + "label": "code:bash (python __init__.py)", + "file_type": "document", + "source_file": "docs/prometheus.md", + "source_location": "L51", + "community": 156, + "norm_label": "code:bash (python __init__.py)", + "id": "docs_prometheus_codeblock_2" + }, + { + "label": "Workflow", + "file_type": "document", + "source_file": "docs/prometheus.md", + "source_location": "L55", + "community": 156, + "norm_label": "workflow", + "id": "docs_prometheus_workflow" + }, + { + "label": "code:mermaid (graph TD)", + "file_type": "document", + "source_file": "docs/prometheus.md", + "source_location": "L57", + "community": 156, + "norm_label": "code:mermaid (graph td)", + "id": "docs_prometheus_codeblock_3" + }, + { + "label": "API Endpoints", + "file_type": "document", + "source_file": "docs/prometheus.md", + "source_location": "L67", + "community": 156, + "norm_label": "api endpoints", + "id": "docs_prometheus_api_endpoints" + }, + { + "label": "License", + "file_type": "document", + "source_file": "docs/prometheus.md", + "source_location": "L74", + "community": 156, + "norm_label": "license", + "id": "docs_prometheus_license" + }, { "label": "PONYTAIL.md", "file_type": "document", @@ -9902,7 +10172,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/compress.py", "source_location": "L46", - "community": 112, + "community": 215, "norm_label": "walk()", "id": "stocks_api_compress_walk" }, @@ -9911,7 +10181,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/compress.py", "source_location": "L75", - "community": 112, + "community": 215, "norm_label": "tocolumnar()", "id": "stocks_api_compress_tocolumnar" }, @@ -9920,7 +10190,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/compress.py", "source_location": "L84", - "community": 112, + "community": 215, "norm_label": "fixheaders()", "id": "stocks_api_compress_fixheaders" }, @@ -9929,7 +10199,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/query.py", "source_location": "L54", - "community": 63, + "community": 101, "norm_label": "stocksquerymanager", "id": "stocks_api_query_stocksquerymanager" }, @@ -9938,7 +10208,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/query.py", "source_location": "L55", - "community": 63, + "community": 101, "norm_label": ".__init__()", "id": "stocks_api_query_stocksquerymanager_init" }, @@ -10010,7 +10280,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/query.py", "source_location": "L331", - "community": 63, + "community": 101, "norm_label": ".querylivecotation()", "id": "stocks_api_query_stocksquerymanager_querylivecotation" }, @@ -10136,7 +10406,7 @@ "file_type": "code", "source_file": "main/app/prometheus/memory.py", "source_location": "L333", - "community": 13, + "community": 126, "norm_label": "searchasync()", "id": "prometheus_memory_searchasync" }, @@ -10163,7 +10433,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L50", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback.", "id": "prometheus_tools_rationale_50" }, @@ -10181,7 +10451,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L112", - "community": 564, + "community": 525, "norm_label": "read a file from the workspace. args: path: path to the file (e.", "id": "prometheus_tools_rationale_112" }, @@ -10199,7 +10469,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L142", - "community": 563, + "community": 495, "norm_label": "list files in the workspace directory. args: path: directory pat", "id": "prometheus_tools_rationale_142" }, @@ -10253,7 +10523,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L49", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback.", "id": "prometheus_tools_rationale_49" }, @@ -10271,7 +10541,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L111", - "community": 487, + "community": 525, "norm_label": "read a file from the workspace. args: path: path to the file (e.", "id": "prometheus_tools_rationale_111" }, @@ -10451,7 +10721,7 @@ "file_type": "code", "source_file": "bench/bench_memory_vector.py", "source_location": "L1", - "community": 13, + "community": 126, "norm_label": "bench_memory_vector.py", "id": "bench_bench_memory_vector_py" }, @@ -10460,7 +10730,7 @@ "file_type": "code", "source_file": "bench/bench_memory_vector.py", "source_location": "L14", - "community": 13, + "community": 126, "norm_label": "benchonce()", "id": "bench_bench_memory_vector_benchonce" }, @@ -10469,7 +10739,7 @@ "file_type": "code", "source_file": "bench/bench_memory_vector.py", "source_location": "L41", - "community": 13, + "community": 126, "norm_label": "main()", "id": "bench_bench_memory_vector_main" }, @@ -11171,7 +11441,7 @@ "file_type": "rationale", "source_file": "main/service/scraper_service.py", "source_location": "L23", - "community": 575, + "community": 563, "norm_label": "p5: register the scraper cron jobs on the shared scheduler. kept in this", "id": "service_scraper_service_rationale_23" }, @@ -12494,7 +12764,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L89", - "community": 544, + "community": 80, "norm_label": "fieldregistry", "id": "prometheus_compact_fieldregistry" }, @@ -12503,7 +12773,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L94", - "community": 544, + "community": 80, "norm_label": ".buildurl()", "id": "prometheus_compact_fieldregistry_buildurl" }, @@ -12512,7 +12782,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L99", - "community": 544, + "community": 80, "norm_label": ".fetchfields()", "id": "prometheus_compact_fieldregistry_fetchfields" }, @@ -12521,7 +12791,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L120", - "community": 544, + "community": 80, "norm_label": ".getfields()", "id": "prometheus_compact_fieldregistry_getfields" }, @@ -12530,7 +12800,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L127", - "community": 544, + "community": 80, "norm_label": ".buildmetricregex()", "id": "prometheus_compact_fieldregistry_buildmetricregex" }, @@ -12539,7 +12809,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L134", - "community": 544, + "community": 80, "norm_label": ".getmetricregex()", "id": "prometheus_compact_fieldregistry_getmetricregex" }, @@ -12548,7 +12818,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L222", - "community": 544, + "community": 80, "norm_label": ".__init__()", "id": "prometheus_compact_prometheuscompactor_init" }, @@ -12575,7 +12845,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L54", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback.", "id": "prometheus_tools_rationale_54" }, @@ -12593,7 +12863,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L113", - "community": 564, + "community": 525, "norm_label": "read a file from the workspace. args: path: path to the file (e.", "id": "prometheus_tools_rationale_113" }, @@ -12692,7 +12962,7 @@ "file_type": "code", "source_file": "main/utils/service_manager.py", "source_location": "L15", - "community": 140, + "community": 536, "norm_label": "servicemanager", "id": "utils_service_manager_servicemanager" }, @@ -13061,7 +13331,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L139", - "community": 544, + "community": 80, "norm_label": ".invalidate()", "id": "prometheus_compact_fieldregistry_invalidate" }, @@ -13070,7 +13340,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L145", - "community": 544, + "community": 80, "norm_label": ".warmup()", "id": "prometheus_compact_fieldregistry_warmup" }, @@ -13205,7 +13475,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/response_cache.py", "source_location": "L1", - "community": 560, + "community": 63, "norm_label": "response_cache.py", "id": "main_app_stocks_api_response_cache_py" }, @@ -13214,7 +13484,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/response_cache.py", "source_location": "L19", - "community": 560, + "community": 63, "norm_label": "responsecache", "id": "stocks_api_response_cache_responsecache" }, @@ -13223,7 +13493,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/response_cache.py", "source_location": "L20", - "community": 560, + "community": 63, "norm_label": ".__init__()", "id": "stocks_api_response_cache_responsecache_init" }, @@ -13232,7 +13502,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/response_cache.py", "source_location": "L29", - "community": 560, + "community": 63, "norm_label": ".makekey()", "id": "stocks_api_response_cache_responsecache_makekey" }, @@ -13241,7 +13511,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/response_cache.py", "source_location": "L34", - "community": 560, + "community": 63, "norm_label": ".get()", "id": "stocks_api_response_cache_responsecache_get" }, @@ -14033,7 +14303,7 @@ "file_type": "code", "source_file": "main/app/prometheus/compact.py", "source_location": "L94", - "community": 544, + "community": 80, "norm_label": ".__new__()", "id": "prometheus_compact_fieldregistry_new" }, @@ -15068,7 +15338,7 @@ "file_type": "code", "source_file": "main/app/prometheus/state.py", "source_location": "L14", - "community": 112, + "community": 215, "norm_label": ".set()", "id": "prometheus_state_harnessstate_set" }, @@ -15122,7 +15392,7 @@ "file_type": "code", "source_file": "main/app/prometheus/tools.py", "source_location": "L89", - "community": 536, + "community": 8, "norm_label": "get_state()", "id": "prometheus_tools_get_state" }, @@ -15347,7 +15617,7 @@ "file_type": "code", "source_file": "main/utils/connectivity.py", "source_location": "L13", - "community": 59, + "community": 541, "norm_label": "checksingledb()", "id": "utils_connectivity_checksingledb" }, @@ -16535,7 +16805,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L44", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback.", "id": "prometheus_tools_rationale_44" }, @@ -16544,7 +16814,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L81", - "community": 536, + "community": 8, "norm_label": "retrieve values from the harness state. use this to recall intermediate results,", "id": "prometheus_tools_rationale_81" }, @@ -22817,7 +23087,7 @@ "file_type": "code", "source_file": "tests/conftest.py", "source_location": "L81", - "community": 137, + "community": 539, "norm_label": "stocks_http_client()", "id": "tests_conftest_stocks_http_client" }, @@ -22826,7 +23096,7 @@ "file_type": "code", "source_file": "tests/conftest.py", "source_location": "L106", - "community": 137, + "community": 539, "norm_label": "client()", "id": "tests_conftest_client" }, @@ -22853,7 +23123,7 @@ "file_type": "rationale", "source_file": "tests/conftest.py", "source_location": "L82", - "community": 137, + "community": 539, "norm_label": "testclient with stocks router + verifyapikey + getcurrentuser overrides.", "id": "tests_conftest_rationale_82" }, @@ -22862,7 +23132,7 @@ "file_type": "rationale", "source_file": "tests/conftest.py", "source_location": "L107", - "community": 137, + "community": 539, "norm_label": "testclient with all routers mounted \u2014 no lifespan (no db/service init). o", "id": "tests_conftest_rationale_107" }, @@ -22970,7 +23240,7 @@ "file_type": "code", "source_file": "tests/test_agent_state_integration.py", "source_location": "L7", - "community": 500, + "community": 474, "norm_label": "testbuildsystempromptstate", "id": "tests_test_agent_state_integration_testbuildsystempromptstate" }, @@ -22979,7 +23249,7 @@ "file_type": "code", "source_file": "tests/test_agent_state_integration.py", "source_location": "L8", - "community": 500, + "community": 474, "norm_label": ".test_build_system_prompt_no_state()", "id": "tests_test_agent_state_integration_testbuildsystempromptstate_test_build_system_prompt_no_state" }, @@ -22988,7 +23258,7 @@ "file_type": "code", "source_file": "tests/test_agent_state_integration.py", "source_location": "L13", - "community": 500, + "community": 474, "norm_label": ".test_build_system_prompt_with_state()", "id": "tests_test_agent_state_integration_testbuildsystempromptstate_test_build_system_prompt_with_state" }, @@ -22997,7 +23267,7 @@ "file_type": "code", "source_file": "tests/test_agent_state_integration.py", "source_location": "L21", - "community": 500, + "community": 474, "norm_label": ".test_build_system_prompt_empty_state()", "id": "tests_test_agent_state_integration_testbuildsystempromptstate_test_build_system_prompt_empty_state" }, @@ -23006,7 +23276,7 @@ "file_type": "code", "source_file": "tests/test_agent_state_integration.py", "source_location": "L27", - "community": 500, + "community": 474, "norm_label": ".test_build_system_prompt_state_after_memories()", "id": "tests_test_agent_state_integration_testbuildsystempromptstate_test_build_system_prompt_state_after_memories" }, @@ -23015,7 +23285,7 @@ "file_type": "code", "source_file": "tests/test_agent_state_integration.py", "source_location": "L37", - "community": 500, + "community": 474, "norm_label": ".test_build_system_prompt_multiple_state_entries()", "id": "tests_test_agent_state_integration_testbuildsystempromptstate_test_build_system_prompt_multiple_state_entries" }, @@ -23096,7 +23366,7 @@ "file_type": "rationale", "source_file": "tests/test_agent_state_integration.py", "source_location": "L9", - "community": 500, + "community": 474, "norm_label": "system prompt should work without state parameter.", "id": "tests_test_agent_state_integration_rationale_9" }, @@ -23105,7 +23375,7 @@ "file_type": "rationale", "source_file": "tests/test_agent_state_integration.py", "source_location": "L14", - "community": 500, + "community": 474, "norm_label": "system prompt should include state context when provided.", "id": "tests_test_agent_state_integration_rationale_14" }, @@ -23114,7 +23384,7 @@ "file_type": "rationale", "source_file": "tests/test_agent_state_integration.py", "source_location": "L22", - "community": 500, + "community": 474, "norm_label": "system prompt should not include state section when empty.", "id": "tests_test_agent_state_integration_rationale_22" }, @@ -23123,7 +23393,7 @@ "file_type": "rationale", "source_file": "tests/test_agent_state_integration.py", "source_location": "L28", - "community": 500, + "community": 474, "norm_label": "state section should appear after memories section.", "id": "tests_test_agent_state_integration_rationale_28" }, @@ -23132,7 +23402,7 @@ "file_type": "rationale", "source_file": "tests/test_agent_state_integration.py", "source_location": "L38", - "community": 500, + "community": 474, "norm_label": "all state entries should appear in the prompt.", "id": "tests_test_agent_state_integration_rationale_38" }, @@ -23276,7 +23546,7 @@ "file_type": "code", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L220", - "community": 110, + "community": 535, "norm_label": "testverifyapikeyintegration", "id": "tests_test_api_key_quota_atomic_testverifyapikeyintegration" }, @@ -23285,7 +23555,7 @@ "file_type": "code", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L223", - "community": 110, + "community": 535, "norm_label": ".test_verify_api_key_success()", "id": "tests_test_api_key_quota_atomic_testverifyapikeyintegration_test_verify_api_key_success" }, @@ -23294,7 +23564,7 @@ "file_type": "code", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L238", - "community": 110, + "community": 535, "norm_label": ".test_verify_api_key_quota_exceeded()", "id": "tests_test_api_key_quota_atomic_testverifyapikeyintegration_test_verify_api_key_quota_exceeded" }, @@ -23303,7 +23573,7 @@ "file_type": "code", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L253", - "community": 110, + "community": 535, "norm_label": ".test_verify_api_key_invalid()", "id": "tests_test_api_key_quota_atomic_testverifyapikeyintegration_test_verify_api_key_invalid" }, @@ -23312,7 +23582,7 @@ "file_type": "code", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L264", - "community": 110, + "community": 535, "norm_label": ".test_verify_api_key_missing()", "id": "tests_test_api_key_quota_atomic_testverifyapikeyintegration_test_verify_api_key_missing" }, @@ -23321,7 +23591,7 @@ "file_type": "code", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L275", - "community": 110, + "community": 535, "norm_label": ".test_verify_api_key_disabled()", "id": "tests_test_api_key_quota_atomic_testverifyapikeyintegration_test_verify_api_key_disabled" }, @@ -23420,7 +23690,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L221", - "community": 110, + "community": 535, "norm_label": "integration tests for the verifyapikey function.", "id": "tests_test_api_key_quota_atomic_rationale_221" }, @@ -23429,7 +23699,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L224", - "community": 110, + "community": 535, "norm_label": "test successful api key verification.", "id": "tests_test_api_key_quota_atomic_rationale_224" }, @@ -23438,7 +23708,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L239", - "community": 110, + "community": 535, "norm_label": "test api key verification when quota is exceeded.", "id": "tests_test_api_key_quota_atomic_rationale_239" }, @@ -23447,7 +23717,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L254", - "community": 110, + "community": 535, "norm_label": "test api key verification with invalid key.", "id": "tests_test_api_key_quota_atomic_rationale_254" }, @@ -23456,7 +23726,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L265", - "community": 110, + "community": 535, "norm_label": "test api key verification with missing key.", "id": "tests_test_api_key_quota_atomic_rationale_265" }, @@ -23465,7 +23735,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L276", - "community": 110, + "community": 535, "norm_label": "test that api key system can be disabled.", "id": "tests_test_api_key_quota_atomic_rationale_276" }, @@ -23474,7 +23744,7 @@ "file_type": "code", "source_file": "tests/test_auth_util.py", "source_location": "L1", - "community": 43, + "community": 491, "norm_label": "test_auth_util.py", "id": "tests_test_auth_util_py" }, @@ -23573,7 +23843,7 @@ "file_type": "code", "source_file": "tests/test_auth_util.py", "source_location": "L69", - "community": 43, + "community": 491, "norm_label": "testsessionexpiryconfig", "id": "tests_test_auth_util_testsessionexpiryconfig" }, @@ -23582,7 +23852,7 @@ "file_type": "code", "source_file": "tests/test_auth_util.py", "source_location": "L70", - "community": 43, + "community": 491, "norm_label": ".test_session_expiry_days_is_30()", "id": "tests_test_auth_util_testsessionexpiryconfig_test_session_expiry_days_is_30" }, @@ -23591,7 +23861,7 @@ "file_type": "code", "source_file": "tests/test_auth_util.py", "source_location": "L73", - "community": 43, + "community": 491, "norm_label": ".test_session_expiry_hours_calculation()", "id": "tests_test_auth_util_testsessionexpiryconfig_test_session_expiry_hours_calculation" }, @@ -23600,7 +23870,7 @@ "file_type": "code", "source_file": "tests/test_auth_util.py", "source_location": "L78", - "community": 43, + "community": 491, "norm_label": ".test_default_token_expiry_equals_30_days()", "id": "tests_test_auth_util_testsessionexpiryconfig_test_default_token_expiry_equals_30_days" }, @@ -23663,7 +23933,7 @@ "file_type": "code", "source_file": "tests/test_config.py", "source_location": "L1", - "community": 102, + "community": 93, "norm_label": "test_config.py", "id": "tests_test_config_py" }, @@ -23726,7 +23996,7 @@ "file_type": "code", "source_file": "tests/test_connectivity_coverage.py", "source_location": "L8", - "community": 59, + "community": 574, "norm_label": "testcheckmysqlconnection", "id": "tests_test_connectivity_coverage_testcheckmysqlconnection" }, @@ -23816,7 +24086,7 @@ "file_type": "code", "source_file": "tests/test_connectivity_coverage.py", "source_location": "L114", - "community": 59, + "community": 573, "norm_label": "testcheckserviceconnection", "id": "tests_test_connectivity_coverage_testcheckserviceconnection" }, @@ -23906,7 +24176,7 @@ "file_type": "rationale", "source_file": "tests/test_connectivity_coverage.py", "source_location": "L9", - "community": 59, + "community": 574, "norm_label": "checkmysqlconnection \u2014 success, errors, engine=none paths.", "id": "tests_test_connectivity_coverage_rationale_9" }, @@ -23915,7 +24185,7 @@ "file_type": "rationale", "source_file": "tests/test_connectivity_coverage.py", "source_location": "L115", - "community": 59, + "community": 573, "norm_label": "checkserviceconnection \u2014 success, not found, errors.", "id": "tests_test_connectivity_coverage_rationale_115" }, @@ -23951,7 +24221,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L57", - "community": 99, + "community": 16, "norm_label": "_make_prometheus_client()", "id": "tests_test_controllers_coverage_make_prometheus_client" }, @@ -24023,7 +24293,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L146", - "community": 120, + "community": 498, "norm_label": "testregisterendpoint", "id": "tests_test_controllers_coverage_testregisterendpoint" }, @@ -24068,7 +24338,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L215", - "community": 120, + "community": 498, "norm_label": "testloginendpoint", "id": "tests_test_controllers_coverage_testloginendpoint" }, @@ -24095,7 +24365,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L257", - "community": 120, + "community": 498, "norm_label": "testlogoutendpoint", "id": "tests_test_controllers_coverage_testlogoutendpoint" }, @@ -24185,7 +24455,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L390", - "community": 120, + "community": 498, "norm_label": "testgooglecallback", "id": "tests_test_controllers_coverage_testgooglecallback" }, @@ -24464,7 +24734,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L849", - "community": 99, + "community": 16, "norm_label": "testprometheusgetsessions", "id": "tests_test_controllers_coverage_testprometheusgetsessions" }, @@ -24473,7 +24743,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L852", - "community": 99, + "community": 16, "norm_label": ".test_get_sessions()", "id": "tests_test_controllers_coverage_testprometheusgetsessions_test_get_sessions" }, @@ -24482,7 +24752,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L867", - "community": 99, + "community": 16, "norm_label": "testprometheuscreatesession", "id": "tests_test_controllers_coverage_testprometheuscreatesession" }, @@ -24491,7 +24761,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L870", - "community": 99, + "community": 16, "norm_label": ".test_create_session()", "id": "tests_test_controllers_coverage_testprometheuscreatesession_test_create_session" }, @@ -24536,7 +24806,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L915", - "community": 104, + "community": 136, "norm_label": "testprometheusgethistory", "id": "tests_test_controllers_coverage_testprometheusgethistory" }, @@ -24545,7 +24815,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L918", - "community": 104, + "community": 136, "norm_label": ".test_get_history_found()", "id": "tests_test_controllers_coverage_testprometheusgethistory_test_get_history_found" }, @@ -24554,7 +24824,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L962", - "community": 104, + "community": 136, "norm_label": ".test_get_history_not_found()", "id": "tests_test_controllers_coverage_testprometheusgethistory_test_get_history_not_found" }, @@ -24599,7 +24869,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1023", - "community": 99, + "community": 16, "norm_label": ".test_chat_new_session()", "id": "tests_test_controllers_coverage_testprometheuschat_test_chat_new_session" }, @@ -24617,7 +24887,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1085", - "community": 16, + "community": 104, "norm_label": ".test_chat_existing_session_not_owner()", "id": "tests_test_controllers_coverage_testprometheuschat_test_chat_existing_session_not_owner" }, @@ -24725,7 +24995,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1229", - "community": 528, + "community": 560, "norm_label": "testaddroletouser", "id": "tests_test_controllers_coverage_testaddroletouser" }, @@ -24734,7 +25004,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1232", - "community": 528, + "community": 560, "norm_label": ".test_add_role_success()", "id": "tests_test_controllers_coverage_testaddroletouser_test_add_role_success" }, @@ -24743,7 +25013,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1249", - "community": 493, + "community": 560, "norm_label": ".test_add_role_already_has_role()", "id": "tests_test_controllers_coverage_testaddroletouser_test_add_role_already_has_role" }, @@ -24788,7 +25058,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1307", - "community": 493, + "community": 560, "norm_label": ".test_get_current_user_session_revoked()", "id": "tests_test_controllers_coverage_testgetcurrentuser_test_get_current_user_session_revoked" }, @@ -24824,7 +25094,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1381", - "community": 498, + "community": 524, "norm_label": "testhashpasswordempty", "id": "tests_test_controllers_coverage_testhashpasswordempty" }, @@ -24833,7 +25103,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1384", - "community": 498, + "community": 524, "norm_label": ".test_empty_password_raises()", "id": "tests_test_controllers_coverage_testhashpasswordempty_test_empty_password_raises" }, @@ -24860,7 +25130,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1410", - "community": 524, + "community": 544, "norm_label": ".test_invalid_token()", "id": "tests_test_controllers_coverage_testverifyaccesstoken_test_invalid_token" }, @@ -24869,7 +25139,7 @@ "file_type": "code", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1422", - "community": 114, + "community": 498, "norm_label": "testextracttokenpayloadreraise", "id": "tests_test_controllers_coverage_testextracttokenpayloadreraise" }, @@ -24932,7 +25202,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L58", - "community": 99, + "community": 16, "norm_label": "return (client, app) with prometheus router and mocked deps.", "id": "tests_test_controllers_coverage_rationale_58" }, @@ -24968,7 +25238,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L147", - "community": 120, + "community": 498, "norm_label": "covers lines 44-54, 63, 66-71: register success, valueerror, generic exception.", "id": "tests_test_controllers_coverage_rationale_147" }, @@ -25013,7 +25283,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L216", - "community": 120, + "community": 498, "norm_label": "covers lines 87-93, 102: login success and failure paths.", "id": "tests_test_controllers_coverage_rationale_216" }, @@ -25040,7 +25310,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L258", - "community": 120, + "community": 498, "norm_label": "covers lines 107, 109-130, 133: logout token extraction and revocation.", "id": "tests_test_controllers_coverage_rationale_258" }, @@ -25058,7 +25328,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L281", - "community": 120, + "community": 498, "norm_label": "covers lines 111-113: token extracted from authorization bearer header.", "id": "tests_test_controllers_coverage_rationale_281" }, @@ -25130,7 +25400,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L391", - "community": 120, + "community": 498, "norm_label": "covers lines 155-156, 158, 160-168, 170-177, 179-184, 186, 190-204: googlecallba", "id": "tests_test_controllers_coverage_rationale_391" }, @@ -25328,7 +25598,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L850", - "community": 99, + "community": 16, "norm_label": "covers lines 33-36: get /prometheus/sessions.", "id": "tests_test_controllers_coverage_rationale_850" }, @@ -25337,7 +25607,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L868", - "community": 99, + "community": 16, "norm_label": "covers line 52: post /prometheus/sessions.", "id": "tests_test_controllers_coverage_rationale_868" }, @@ -25382,7 +25652,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L916", - "community": 104, + "community": 136, "norm_label": "covers lines 77, 83-84, 86: get /prometheus/history/{sessionid}.", "id": "tests_test_controllers_coverage_rationale_916" }, @@ -25391,7 +25661,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L919", - "community": 104, + "community": 136, "norm_label": "covers lines 77, 86: session found with history.", "id": "tests_test_controllers_coverage_rationale_919" }, @@ -25400,7 +25670,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L963", - "community": 104, + "community": 136, "norm_label": "covers lines 83-84: session not found.", "id": "tests_test_controllers_coverage_rationale_963" }, @@ -25445,7 +25715,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1024", - "community": 99, + "community": 16, "norm_label": "covers lines 118-119: sessionid is none, new session created.", "id": "tests_test_controllers_coverage_rationale_1024" }, @@ -25463,7 +25733,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1086", - "community": 16, + "community": 104, "norm_label": "covers lines 120-121: session ownership check fails.", "id": "tests_test_controllers_coverage_rationale_1086" }, @@ -25544,7 +25814,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1230", - "community": 528, + "community": 560, "norm_label": "covers lines 13, 17, 19-20, 22-27: usermanager.addroletouser.", "id": "tests_test_controllers_coverage_rationale_1230" }, @@ -25553,7 +25823,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1233", - "community": 528, + "community": 560, "norm_label": "covers lines 17, 22-27: user found, role not present, role added.", "id": "tests_test_controllers_coverage_rationale_1233" }, @@ -25562,7 +25832,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1250", - "community": 14, + "community": 560, "norm_label": "covers line 27: user already has the role.", "id": "tests_test_controllers_coverage_rationale_1250" }, @@ -25598,7 +25868,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1308", - "community": 493, + "community": 560, "norm_label": "covers lines 42-44: session validation fails.", "id": "tests_test_controllers_coverage_rationale_1308" }, @@ -25661,7 +25931,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1411", - "community": 524, + "community": 544, "norm_label": "covers lines 50-51: jwt.invalidtokenerror.", "id": "tests_test_controllers_coverage_rationale_1411" }, @@ -25670,7 +25940,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1423", - "community": 114, + "community": 498, "norm_label": "covers line 67: extracttokenpayload re-raises httpexception from verifyaccesstok", "id": "tests_test_controllers_coverage_rationale_1423" }, @@ -26444,7 +26714,7 @@ "file_type": "code", "source_file": "tests/test_events.py", "source_location": "L1", - "community": 101, + "community": 12, "norm_label": "test_events.py", "id": "tests_test_events_py" }, @@ -26534,7 +26804,7 @@ "file_type": "rationale", "source_file": "tests/test_events.py", "source_location": "L1", - "community": 101, + "community": 12, "norm_label": "tests for looplogger \u2014 appends events to history json list.", "id": "tests_test_events_rationale_1" }, @@ -26660,7 +26930,7 @@ "file_type": "code", "source_file": "tests/test_http_session_coverage.py", "source_location": "L1", - "community": 522, + "community": 186, "norm_label": "test_http_session_coverage.py", "id": "tests_test_http_session_coverage_py" }, @@ -26669,7 +26939,7 @@ "file_type": "code", "source_file": "tests/test_http_session_coverage.py", "source_location": "L8", - "community": 522, + "community": 186, "norm_label": "testgetsession", "id": "tests_test_http_session_coverage_testgetsession" }, @@ -26678,7 +26948,7 @@ "file_type": "code", "source_file": "tests/test_http_session_coverage.py", "source_location": "L9", - "community": 522, + "community": 186, "norm_label": ".test_returns_same_session()", "id": "tests_test_http_session_coverage_testgetsession_test_returns_same_session" }, @@ -26687,7 +26957,7 @@ "file_type": "code", "source_file": "tests/test_http_session_coverage.py", "source_location": "L16", - "community": 522, + "community": 186, "norm_label": ".test_returns_requests_session()", "id": "tests_test_http_session_coverage_testgetsession_test_returns_requests_session" }, @@ -26696,7 +26966,7 @@ "file_type": "rationale", "source_file": "tests/test_http_session_coverage.py", "source_location": "L1", - "community": 522, + "community": 186, "norm_label": "tests for main/utils/http_session.py \u2014 covers all branches.", "id": "tests_test_http_session_coverage_rationale_1" }, @@ -27146,7 +27416,7 @@ "file_type": "code", "source_file": "tests/test_memory_dedup.py", "source_location": "L8", - "community": 140, + "community": 67, "norm_label": "_create_memory()", "id": "tests_test_memory_dedup_create_memory" }, @@ -27155,7 +27425,7 @@ "file_type": "code", "source_file": "tests/test_memory_dedup.py", "source_location": "L12", - "community": 140, + "community": 67, "norm_label": "_count_memories()", "id": "tests_test_memory_dedup_count_memories" }, @@ -27164,7 +27434,7 @@ "file_type": "code", "source_file": "tests/test_memory_dedup.py", "source_location": "L20", - "community": 140, + "community": 67, "norm_label": "_get_memory()", "id": "tests_test_memory_dedup_get_memory" }, @@ -27182,7 +27452,7 @@ "file_type": "code", "source_file": "tests/test_memory_dedup.py", "source_location": "L29", - "community": 140, + "community": 67, "norm_label": ".test_exact_same_key_updates()", "id": "tests_test_memory_dedup_testexactsamekeyupdates_test_exact_same_key_updates" }, @@ -27200,7 +27470,7 @@ "file_type": "code", "source_file": "tests/test_memory_dedup.py", "source_location": "L37", - "community": 140, + "community": 67, "norm_label": ".test_similar_key_merges()", "id": "tests_test_memory_dedup_testsimilarkeymerges_test_similar_key_merges" }, @@ -27218,7 +27488,7 @@ "file_type": "code", "source_file": "tests/test_memory_dedup.py", "source_location": "L47", - "community": 140, + "community": 67, "norm_label": ".test_different_keys_no_merge()", "id": "tests_test_memory_dedup_testdifferentkeysnomerge_test_different_keys_no_merge" }, @@ -27236,7 +27506,7 @@ "file_type": "code", "source_file": "tests/test_memory_dedup.py", "source_location": "L56", - "community": 140, + "community": 67, "norm_label": ".test_merge_boosts_score()", "id": "tests_test_memory_dedup_testmergeboostsscore_test_merge_boosts_score" }, @@ -27254,7 +27524,7 @@ "file_type": "code", "source_file": "tests/test_memory_dedup.py", "source_location": "L65", - "community": 140, + "community": 67, "norm_label": ".test_merge_increments_access()", "id": "tests_test_memory_dedup_testmergeincrementsaccess_test_merge_increments_access" }, @@ -27272,7 +27542,7 @@ "file_type": "code", "source_file": "tests/test_memory_dedup.py", "source_location": "L74", - "community": 140, + "community": 67, "norm_label": ".test_threshold_boundary()", "id": "tests_test_memory_dedup_testthresholdboundary_test_threshold_boundary" }, @@ -27281,7 +27551,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_dedup.py", "source_location": "L38", - "community": 140, + "community": 67, "norm_label": "keys with jaccard > 0.8 should merge.", "id": "tests_test_memory_dedup_rationale_38" }, @@ -27290,7 +27560,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_dedup.py", "source_location": "L48", - "community": 140, + "community": 67, "norm_label": "keys with low similarity should not merge.", "id": "tests_test_memory_dedup_rationale_48" }, @@ -27299,7 +27569,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_dedup.py", "source_location": "L75", - "community": 140, + "community": 67, "norm_label": "keys with jaccard <= 0.8 should not merge.", "id": "tests_test_memory_dedup_rationale_75" }, @@ -27515,7 +27785,7 @@ "file_type": "code", "source_file": "tests/test_memory_maintenance.py", "source_location": "L171", - "community": 518, + "community": 488, "norm_label": ".test_no_memories_does_not_crash()", "id": "tests_test_memory_maintenance_testemptydatabase_test_no_memories_does_not_crash" }, @@ -27641,7 +27911,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L9", - "community": 140, + "community": 576, "norm_label": ".test_basic_user()", "id": "tests_test_memory_manager_testgetmemorylimit_test_basic_user" }, @@ -27659,7 +27929,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L15", - "community": 140, + "community": 581, "norm_label": ".test_admin_user()", "id": "tests_test_memory_manager_testgetmemorylimit_test_admin_user" }, @@ -27695,7 +27965,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L40", - "community": 140, + "community": 582, "norm_label": ".test_unchanged()", "id": "tests_test_memory_manager_testupsertmemory_test_unchanged" }, @@ -27704,7 +27974,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L45", - "community": 140, + "community": 583, "norm_label": ".test_limit_enforcement()", "id": "tests_test_memory_manager_testupsertmemory_test_limit_enforcement" }, @@ -27713,7 +27983,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L59", - "community": 140, + "community": 584, "norm_label": ".test_limit_not_enforced_without_roles()", "id": "tests_test_memory_manager_testupsertmemory_test_limit_not_enforced_without_roles" }, @@ -27722,7 +27992,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L66", - "community": 140, + "community": 585, "norm_label": ".test_upsert_with_embedding()", "id": "tests_test_memory_manager_testupsertmemory_test_upsert_with_embedding" }, @@ -27776,7 +28046,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L102", - "community": 140, + "community": 575, "norm_label": ".test_returns_memories()", "id": "tests_test_memory_manager_testgetusermemories_test_returns_memories" }, @@ -27785,7 +28055,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L109", - "community": 140, + "community": 578, "norm_label": ".test_pagination()", "id": "tests_test_memory_manager_testgetusermemories_test_pagination" }, @@ -27794,7 +28064,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L115", - "community": 140, + "community": 579, "norm_label": ".test_excludes_archived()", "id": "tests_test_memory_manager_testgetusermemories_test_excludes_archived" }, @@ -27812,7 +28082,7 @@ "file_type": "code", "source_file": "tests/test_memory_manager.py", "source_location": "L126", - "community": 140, + "community": 580, "norm_label": ".test_soft_delete()", "id": "tests_test_memory_manager_testdeletememory_test_soft_delete" }, @@ -27938,7 +28208,7 @@ "file_type": "code", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L60", - "community": 112, + "community": 215, "norm_label": ".test_memory_tool_names_unchanged()", "id": "tests_test_memory_tools_wiring_testmemorytoolfunctions_test_memory_tool_names_unchanged" }, @@ -27947,7 +28217,7 @@ "file_type": "code", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L64", - "community": 569, + "community": 572, "norm_label": "testtoolregistry", "id": "tests_test_memory_tools_wiring_testtoolregistry" }, @@ -27956,7 +28226,7 @@ "file_type": "code", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L67", - "community": 569, + "community": 572, "norm_label": ".test_registry_contains_memory_tools()", "id": "tests_test_memory_tools_wiring_testtoolregistry_test_registry_contains_memory_tools" }, @@ -27965,7 +28235,7 @@ "file_type": "code", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L71", - "community": 569, + "community": 572, "norm_label": ".test_registry_values_are_callable()", "id": "tests_test_memory_tools_wiring_testtoolregistry_test_registry_values_are_callable" }, @@ -27974,7 +28244,7 @@ "file_type": "code", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L75", - "community": 569, + "community": 572, "norm_label": ".test_registry_matches_tool_names()", "id": "tests_test_memory_tools_wiring_testtoolregistry_test_registry_matches_tool_names" }, @@ -27983,7 +28253,7 @@ "file_type": "code", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L79", - "community": 573, + "community": 49, "norm_label": "testmakechatincludesmemorytools", "id": "tests_test_memory_tools_wiring_testmakechatincludesmemorytools" }, @@ -28001,7 +28271,7 @@ "file_type": "code", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L112", - "community": 576, + "community": 49, "norm_label": "testdispatchroutesmemorytools", "id": "tests_test_memory_tools_wiring_testdispatchroutesmemorytools" }, @@ -28055,7 +28325,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L65", - "community": 569, + "community": 572, "norm_label": "tool_registry pattern must work correctly.", "id": "tests_test_memory_tools_wiring_rationale_65" }, @@ -28064,7 +28334,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L80", - "community": 573, + "community": 49, "norm_label": "makechat must include memory_tools alongside mcp sessions.", "id": "tests_test_memory_tools_wiring_rationale_80" }, @@ -28073,7 +28343,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L113", - "community": 576, + "community": 49, "norm_label": "dispatchtoolcall must route memory tool names via tool_registry.", "id": "tests_test_memory_tools_wiring_rationale_113" }, @@ -28631,7 +28901,7 @@ "file_type": "code", "source_file": "tests/test_pagination.py", "source_location": "L1", - "community": 482, + "community": 504, "norm_label": "test_pagination.py", "id": "tests_test_pagination_py" }, @@ -28640,7 +28910,7 @@ "file_type": "code", "source_file": "tests/test_pagination.py", "source_location": "L14", - "community": 482, + "community": 504, "norm_label": "app()", "id": "tests_test_pagination_app" }, @@ -28649,7 +28919,7 @@ "file_type": "code", "source_file": "tests/test_pagination.py", "source_location": "L35", - "community": 482, + "community": 504, "norm_label": "client()", "id": "tests_test_pagination_client" }, @@ -28748,7 +29018,7 @@ "file_type": "rationale", "source_file": "tests/test_pagination.py", "source_location": "L1", - "community": 482, + "community": 504, "norm_label": "tests for inline pagination params (used in user + prometheus controllers).", "id": "tests_test_pagination_rationale_1" }, @@ -29351,7 +29621,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_auth_coverage.py", "source_location": "L919", - "community": 474, + "community": 58, "norm_label": "test_get_google_sso_with_redirect()", "id": "tests_test_prometheus_auth_coverage_test_get_google_sso_with_redirect" }, @@ -29360,7 +29630,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_auth_coverage.py", "source_location": "L938", - "community": 474, + "community": 58, "norm_label": "test_get_google_sso_default_redirect()", "id": "tests_test_prometheus_auth_coverage_test_get_google_sso_default_redirect" }, @@ -29477,7 +29747,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L44", - "community": 541, + "community": 512, "norm_label": "testmemorytoolfunctions", "id": "tests_test_prometheus_tools_testmemorytoolfunctions" }, @@ -29486,7 +29756,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L45", - "community": 541, + "community": 512, "norm_label": ".test_search_memory_has_docstring()", "id": "tests_test_prometheus_tools_testmemorytoolfunctions_test_search_memory_has_docstring" }, @@ -29495,7 +29765,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L49", - "community": 541, + "community": 512, "norm_label": ".test_save_memory_has_docstring()", "id": "tests_test_prometheus_tools_testmemorytoolfunctions_test_save_memory_has_docstring" }, @@ -29504,7 +29774,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L53", - "community": 541, + "community": 512, "norm_label": ".test_search_memory_signature()", "id": "tests_test_prometheus_tools_testmemorytoolfunctions_test_search_memory_signature" }, @@ -29513,7 +29783,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L59", - "community": 541, + "community": 512, "norm_label": ".test_save_memory_signature()", "id": "tests_test_prometheus_tools_testmemorytoolfunctions_test_save_memory_signature" }, @@ -29522,7 +29792,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L66", - "community": 541, + "community": 512, "norm_label": ".test_search_memory_has_type_hints()", "id": "tests_test_prometheus_tools_testmemorytoolfunctions_test_search_memory_has_type_hints" }, @@ -29531,7 +29801,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L71", - "community": 541, + "community": 512, "norm_label": ".test_save_memory_has_type_hints()", "id": "tests_test_prometheus_tools_testmemorytoolfunctions_test_save_memory_has_type_hints" }, @@ -29540,7 +29810,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L77", - "community": 541, + "community": 512, "norm_label": ".test_memory_tools_is_list_of_callables()", "id": "tests_test_prometheus_tools_testmemorytoolfunctions_test_memory_tools_is_list_of_callables" }, @@ -29549,7 +29819,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L83", - "community": 541, + "community": 512, "norm_label": ".test_memory_tool_names_unchanged()", "id": "tests_test_prometheus_tools_testmemorytoolfunctions_test_memory_tool_names_unchanged" }, @@ -29666,7 +29936,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L151", - "community": 580, + "community": 571, "norm_label": "testtoolregistry", "id": "tests_test_prometheus_tools_testtoolregistry" }, @@ -29675,7 +29945,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L152", - "community": 580, + "community": 571, "norm_label": ".test_registry_contains_memory_tools()", "id": "tests_test_prometheus_tools_testtoolregistry_test_registry_contains_memory_tools" }, @@ -29684,7 +29954,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L156", - "community": 580, + "community": 571, "norm_label": ".test_registry_values_are_callable()", "id": "tests_test_prometheus_tools_testtoolregistry_test_registry_values_are_callable" }, @@ -29693,7 +29963,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L160", - "community": 580, + "community": 571, "norm_label": ".test_registry_matches_tool_names()", "id": "tests_test_prometheus_tools_testtoolregistry_test_registry_matches_tool_names" }, @@ -31349,7 +31619,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L1", - "community": 536, + "community": 8, "norm_label": "test_state_tools.py", "id": "tests_test_state_tools_py" }, @@ -31439,7 +31709,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L60", - "community": 536, + "community": 8, "norm_label": "testgetstate", "id": "tests_test_state_tools_testgetstate" }, @@ -31448,7 +31718,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L62", - "community": 536, + "community": 8, "norm_label": "test_get_state_specific_key()", "id": "tests_test_state_tools_test_get_state_specific_key" }, @@ -31457,7 +31727,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L69", - "community": 536, + "community": 8, "norm_label": "test_get_state_all()", "id": "tests_test_state_tools_test_get_state_all" }, @@ -31466,7 +31736,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L77", - "community": 536, + "community": 8, "norm_label": "test_get_state_missing_key()", "id": "tests_test_state_tools_test_get_state_missing_key" }, @@ -31475,7 +31745,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L83", - "community": 536, + "community": 8, "norm_label": "test_get_state_no_state()", "id": "tests_test_state_tools_test_get_state_no_state" }, @@ -31484,7 +31754,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L88", - "community": 536, + "community": 8, "norm_label": "testsetstate", "id": "tests_test_state_tools_testsetstate" }, @@ -31493,7 +31763,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L90", - "community": 536, + "community": 8, "norm_label": "test_set_state()", "id": "tests_test_state_tools_test_set_state" }, @@ -31511,7 +31781,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L102", - "community": 536, + "community": 8, "norm_label": "teststatedispatch", "id": "tests_test_state_tools_teststatedispatch" }, @@ -31520,7 +31790,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L104", - "community": 536, + "community": 8, "norm_label": "test_dispatch_get_state()", "id": "tests_test_state_tools_test_dispatch_get_state" }, @@ -31529,7 +31799,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L114", - "community": 536, + "community": 8, "norm_label": "test_dispatch_set_state()", "id": "tests_test_state_tools_test_dispatch_set_state" }, @@ -31700,7 +31970,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L23", - "community": 21, + "community": 112, "norm_label": "_make_stocks_df()", "id": "tests_test_stocks_api_coverage_make_stocks_df" }, @@ -31952,7 +32222,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L344", - "community": 63, + "community": 101, "norm_label": "._make_manager()", "id": "tests_test_stocks_api_coverage_testdeserializejsoncolumns_make_manager" }, @@ -32051,7 +32321,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L419", - "community": 535, + "community": 520, "norm_label": ".test_deserialize_float_nan_direct()", "id": "tests_test_stocks_api_coverage_testdeserializejsoncolumns_test_deserialize_float_nan_direct" }, @@ -32060,7 +32330,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L433", - "community": 126, + "community": 566, "norm_label": ".test_deserialize_non_nan_float()", "id": "tests_test_stocks_api_coverage_testdeserializejsoncolumns_test_deserialize_non_nan_float" }, @@ -32105,7 +32375,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L501", - "community": 3, + "community": 101, "norm_label": "._make_manager()", "id": "tests_test_stocks_api_coverage_testfilterbysearchterms_make_manager" }, @@ -32168,7 +32438,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L553", - "community": 21, + "community": 112, "norm_label": "testqueryhistorical", "id": "tests_test_stocks_api_coverage_testqueryhistorical" }, @@ -32177,7 +32447,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L556", - "community": 21, + "community": 101, "norm_label": "._make_manager()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_make_manager" }, @@ -32186,7 +32456,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L566", - "community": 21, + "community": 112, "norm_label": ".test_cache_not_initialized_raises_503()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_cache_not_initialized_raises_503" }, @@ -32195,7 +32465,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L574", - "community": 21, + "community": 112, "norm_label": ".test_basic_historical_query()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_basic_historical_query" }, @@ -32204,7 +32474,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L583", - "community": 21, + "community": 112, "norm_label": ".test_historical_with_search()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_with_search" }, @@ -32213,7 +32483,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L591", - "community": 566, + "community": 28, "norm_label": ".test_historical_with_fields()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_with_fields" }, @@ -32222,7 +32492,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L599", - "community": 21, + "community": 112, "norm_label": ".test_historical_with_dates()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_with_dates" }, @@ -32231,7 +32501,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L605", - "community": 21, + "community": 112, "norm_label": ".test_historical_with_order_by()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_with_order_by" }, @@ -32240,7 +32510,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L611", - "community": 21, + "community": 112, "norm_label": ".test_historical_with_limit()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_with_limit" }, @@ -32258,7 +32528,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L628", - "community": 21, + "community": 112, "norm_label": ".test_historical_sorts_by_time()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_sorts_by_time" }, @@ -32267,7 +32537,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L634", - "community": 21, + "community": 112, "norm_label": ".test_historical_deduplicates_by_ticker()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_deduplicates_by_ticker" }, @@ -32285,7 +32555,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L660", - "community": 521, + "community": 543, "norm_label": ".test_historical_with_invalid_dates()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_with_invalid_dates" }, @@ -32294,7 +32564,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L669", - "community": 21, + "community": 112, "norm_label": ".test_historical_search_with_no_results()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_search_with_no_results" }, @@ -32312,7 +32582,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L686", - "community": 28, + "community": 562, "norm_label": ".test_historical_with_date_range()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_with_date_range" }, @@ -32330,7 +32600,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L701", - "community": 21, + "community": 112, "norm_label": ".test_historical_requires_search_fields_or_dates()", "id": "tests_test_stocks_api_coverage_testqueryhistorical_test_historical_requires_search_fields_or_dates" }, @@ -32339,7 +32609,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L712", - "community": 21, + "community": 112, "norm_label": "testqueryfundamental", "id": "tests_test_stocks_api_coverage_testqueryfundamental" }, @@ -32357,7 +32627,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L725", - "community": 21, + "community": 112, "norm_label": ".test_cache_not_initialized_raises_503()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_cache_not_initialized_raises_503" }, @@ -32366,7 +32636,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L733", - "community": 21, + "community": 112, "norm_label": ".test_basic_fundamental_query()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_basic_fundamental_query" }, @@ -32375,7 +32645,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L741", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_with_search()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_with_search" }, @@ -32384,7 +32654,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L748", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_with_fields()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_with_fields" }, @@ -32393,7 +32663,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L754", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_with_date_range()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_with_date_range" }, @@ -32402,7 +32672,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L760", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_with_single_date()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_with_single_date" }, @@ -32411,7 +32681,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L766", - "community": 39, + "community": 497, "norm_label": ".test_fundamental_with_invalid_date()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_with_invalid_date" }, @@ -32420,7 +32690,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L776", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_with_order_by()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_with_order_by" }, @@ -32429,7 +32699,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L782", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_with_limit()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_with_limit" }, @@ -32438,7 +32708,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L788", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_deduplicates_without_search()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_deduplicates_without_search" }, @@ -32447,7 +32717,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L796", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_with_search_no_dedup()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_with_search_no_dedup" }, @@ -32456,7 +32726,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L802", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_exception_returns_500()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_exception_returns_500" }, @@ -32465,7 +32735,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L819", - "community": 39, + "community": 17, "norm_label": ".test_fundamental_empty_search_string_no_dedup()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_empty_search_string_no_dedup" }, @@ -32474,7 +32744,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L828", - "community": 39, + "community": 17, "norm_label": ".test_fundamental_no_time_column()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_no_time_column" }, @@ -32519,7 +32789,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L890", - "community": 17, + "community": 39, "norm_label": ".test_fundamental_search_fallback_string_match()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_search_fallback_string_match" }, @@ -32537,7 +32807,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L913", - "community": 488, + "community": 570, "norm_label": ".test_fundamental_excludes_cotacao_10y()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_excludes_cotacao_10y" }, @@ -32546,7 +32816,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L940", - "community": 46, + "community": 101, "norm_label": ".test_fundamental_does_not_mutate_cache_time_dtype()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_does_not_mutate_cache_time_dtype" }, @@ -32555,7 +32825,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L963", - "community": 21, + "community": 112, "norm_label": ".test_fundamental_requires_search_fields_or_dates()", "id": "tests_test_stocks_api_coverage_testqueryfundamental_test_fundamental_requires_search_fields_or_dates" }, @@ -32717,7 +32987,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1139", - "community": 543, + "community": 521, "norm_label": ".test_cotations_http_route()", "id": "tests_test_stocks_api_coverage_testquerycotations_test_cotations_http_route" }, @@ -32807,7 +33077,7 @@ "file_type": "code", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1265", - "community": 136, + "community": 234, "norm_label": ".test_http_route_search_required()", "id": "tests_test_stocks_api_coverage_testquerylivecotation_test_http_route_search_required" }, @@ -32861,7 +33131,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L24", - "community": 21, + "community": 112, "norm_label": "return a small dataframe with the columns the query module expects.", "id": "tests_test_stocks_api_coverage_rationale_24" }, @@ -33005,7 +33275,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L420", - "community": 535, + "community": 520, "norm_label": "replacenan handles direct float nan values (line 34).", "id": "tests_test_stocks_api_coverage_rationale_420" }, @@ -33014,7 +33284,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L434", - "community": 126, + "community": 566, "norm_label": "non-json-dict/list string is left as-is.", "id": "tests_test_stocks_api_coverage_rationale_434" }, @@ -33059,7 +33329,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L554", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 77-132.", "id": "tests_test_stocks_api_coverage_rationale_554" }, @@ -33068,7 +33338,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L592", - "community": 566, + "community": 28, "norm_label": "pass field name without year (how categorizecolumns returns them).", "id": "tests_test_stocks_api_coverage_rationale_592" }, @@ -33095,7 +33365,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L661", - "community": 521, + "community": 543, "norm_label": "invalid date format raises exception (line 132).", "id": "tests_test_stocks_api_coverage_rationale_661" }, @@ -33113,7 +33383,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L687", - "community": 28, + "community": 562, "norm_label": "historical query with a year range.", "id": "tests_test_stocks_api_coverage_rationale_687" }, @@ -33131,7 +33401,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L702", - "community": 21, + "community": 112, "norm_label": "calling with all none returns 400.", "id": "tests_test_stocks_api_coverage_rationale_702" }, @@ -33140,7 +33410,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L713", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 142-202.", "id": "tests_test_stocks_api_coverage_rationale_713" }, @@ -33149,7 +33419,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L767", - "community": 39, + "community": 497, "norm_label": "invalid date -> inner 400 passes through (not wrapped as 500).", "id": "tests_test_stocks_api_coverage_rationale_767" }, @@ -33158,7 +33428,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L820", - "community": 39, + "community": 17, "norm_label": "search.strip() == '' should still dedup (line 181).", "id": "tests_test_stocks_api_coverage_rationale_820" }, @@ -33167,7 +33437,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L829", - "community": 39, + "community": 17, "norm_label": "dataframe without time column.", "id": "tests_test_stocks_api_coverage_rationale_829" }, @@ -33176,7 +33446,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L842", - "community": 39, + "community": 497, "norm_label": "two dates in the range, both valid.", "id": "tests_test_stocks_api_coverage_rationale_842" }, @@ -33212,7 +33482,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L891", - "community": 17, + "community": 39, "norm_label": "search with no index match falls back to string startswith.", "id": "tests_test_stocks_api_coverage_rationale_891" }, @@ -33230,7 +33500,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L914", - "community": 488, + "community": 570, "norm_label": "cotacao 10y padrao and cotacao 10y ajustada belong to /cotations, not /fundament", "id": "tests_test_stocks_api_coverage_rationale_914" }, @@ -33239,7 +33509,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L941", - "community": 46, + "community": 101, "norm_label": "regression: queryfundamental must not mutate the shared cache time column.", "id": "tests_test_stocks_api_coverage_rationale_941" }, @@ -33284,7 +33554,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1140", - "community": 543, + "community": 521, "norm_label": "hit the actual /stocks/cotations http endpoint with adjusted=false.", "id": "tests_test_stocks_api_coverage_rationale_1140" }, @@ -33302,7 +33572,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1266", - "community": 136, + "community": 234, "norm_label": "get /stocks/realtime-cotation without search returns 422.", "id": "tests_test_stocks_api_coverage_rationale_1266" }, @@ -34328,7 +34598,7 @@ "file_type": "code", "source_file": "tests/test_thread_safety.py", "source_location": "L21", - "community": 186, + "community": 137, "norm_label": "testgetsession", "id": "tests_test_thread_safety_testgetsession" }, @@ -34337,7 +34607,7 @@ "file_type": "code", "source_file": "tests/test_thread_safety.py", "source_location": "L24", - "community": 186, + "community": 137, "norm_label": ".test_same_session_within_same_thread()", "id": "tests_test_thread_safety_testgetsession_test_same_session_within_same_thread" }, @@ -34346,7 +34616,7 @@ "file_type": "code", "source_file": "tests/test_thread_safety.py", "source_location": "L32", - "community": 186, + "community": 137, "norm_label": ".test_different_sessions_in_different_threads()", "id": "tests_test_thread_safety_testgetsession_test_different_sessions_in_different_threads" }, @@ -34355,7 +34625,7 @@ "file_type": "code", "source_file": "tests/test_thread_safety.py", "source_location": "L52", - "community": 186, + "community": 137, "norm_label": ".test_isolation_under_high_concurrency()", "id": "tests_test_thread_safety_testgetsession_test_isolation_under_high_concurrency" }, @@ -34364,7 +34634,7 @@ "file_type": "code", "source_file": "tests/test_thread_safety.py", "source_location": "L73", - "community": 186, + "community": 137, "norm_label": ".test_session_is_requests_session()", "id": "tests_test_thread_safety_testgetsession_test_session_is_requests_session" }, @@ -34445,7 +34715,7 @@ "file_type": "rationale", "source_file": "tests/test_thread_safety.py", "source_location": "L22", - "community": 186, + "community": 137, "norm_label": "verify that getsession() returns per-thread session instances.", "id": "tests_test_thread_safety_rationale_22" }, @@ -34454,7 +34724,7 @@ "file_type": "rationale", "source_file": "tests/test_thread_safety.py", "source_location": "L25", - "community": 186, + "community": 137, "norm_label": "calling getsession() twice in the same thread returns the same object.", "id": "tests_test_thread_safety_rationale_25" }, @@ -34463,7 +34733,7 @@ "file_type": "rationale", "source_file": "tests/test_thread_safety.py", "source_location": "L33", - "community": 186, + "community": 137, "norm_label": "two threads must not share a session object.", "id": "tests_test_thread_safety_rationale_33" }, @@ -34472,7 +34742,7 @@ "file_type": "rationale", "source_file": "tests/test_thread_safety.py", "source_location": "L53", - "community": 186, + "community": 137, "norm_label": "with 20 concurrent threads, every thread must get its own session.", "id": "tests_test_thread_safety_rationale_53" }, @@ -34481,7 +34751,7 @@ "file_type": "rationale", "source_file": "tests/test_thread_safety.py", "source_location": "L74", - "community": 186, + "community": 137, "norm_label": "the returned object must be a real requests.session.", "id": "tests_test_thread_safety_rationale_74" }, @@ -34553,7 +34823,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L1", - "community": 518, + "community": 488, "norm_label": "test_type_aware_decay.py", "id": "tests_test_type_aware_decay_py" }, @@ -34562,7 +34832,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L11", - "community": 518, + "community": 488, "norm_label": "_create()", "id": "tests_test_type_aware_decay_create" }, @@ -34571,7 +34841,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L29", - "community": 518, + "community": 488, "norm_label": "testtypeawaredecay", "id": "tests_test_type_aware_decay_testtypeawaredecay" }, @@ -34580,7 +34850,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L30", - "community": 518, + "community": 488, "norm_label": ".test_preference_decays_slowly()", "id": "tests_test_type_aware_decay_testtypeawaredecay_test_preference_decays_slowly" }, @@ -34589,7 +34859,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L36", - "community": 518, + "community": 488, "norm_label": ".test_context_decays_fast()", "id": "tests_test_type_aware_decay_testtypeawaredecay_test_context_decays_fast" }, @@ -34598,7 +34868,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L42", - "community": 518, + "community": 488, "norm_label": ".test_analysis_decays_normally()", "id": "tests_test_type_aware_decay_testtypeawaredecay_test_analysis_decays_normally" }, @@ -34607,7 +34877,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L48", - "community": 518, + "community": 488, "norm_label": ".test_feedback_decays_medium()", "id": "tests_test_type_aware_decay_testtypeawaredecay_test_feedback_decays_medium" }, @@ -34616,7 +34886,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L54", - "community": 518, + "community": 488, "norm_label": ".test_unknown_type_uses_default()", "id": "tests_test_type_aware_decay_testtypeawaredecay_test_unknown_type_uses_default" }, @@ -34625,7 +34895,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L60", - "community": 518, + "community": 488, "norm_label": ".test_mixed_types_all_correct()", "id": "tests_test_type_aware_decay_testtypeawaredecay_test_mixed_types_all_correct" }, @@ -34634,7 +34904,7 @@ "file_type": "code", "source_file": "tests/test_type_aware_decay.py", "source_location": "L76", - "community": 518, + "community": 488, "norm_label": ".test_preference_survives_longer()", "id": "tests_test_type_aware_decay_testtypeawaredecay_test_preference_survives_longer" }, @@ -34643,7 +34913,7 @@ "file_type": "rationale", "source_file": "tests/test_type_aware_decay.py", "source_location": "L77", - "community": 518, + "community": 488, "norm_label": "after 10 cycles, preference (0.99^10) > context (0.90^10).", "id": "tests_test_type_aware_decay_rationale_77" }, @@ -34652,7 +34922,7 @@ "file_type": "code", "source_file": "tests/test_user_deps.py", "source_location": "L1", - "community": 482, + "community": 500, "norm_label": "test_user_deps.py", "id": "tests_test_user_deps_py" }, @@ -34796,7 +35066,7 @@ "file_type": "code", "source_file": "tests/test_vector_utils.py", "source_location": "L6", - "community": 131, + "community": 13, "norm_label": "testbatchcosinesimilarity", "id": "tests_test_vector_utils_testbatchcosinesimilarity" }, @@ -34805,7 +35075,7 @@ "file_type": "code", "source_file": "tests/test_vector_utils.py", "source_location": "L7", - "community": 131, + "community": 13, "norm_label": ".test_empty_matrix()", "id": "tests_test_vector_utils_testbatchcosinesimilarity_test_empty_matrix" }, @@ -34814,7 +35084,7 @@ "file_type": "code", "source_file": "tests/test_vector_utils.py", "source_location": "L11", - "community": 131, + "community": 13, "norm_label": ".test_single_row()", "id": "tests_test_vector_utils_testbatchcosinesimilarity_test_single_row" }, @@ -34823,7 +35093,7 @@ "file_type": "code", "source_file": "tests/test_vector_utils.py", "source_location": "L17", - "community": 131, + "community": 13, "norm_label": ".test_multiple_rows()", "id": "tests_test_vector_utils_testbatchcosinesimilarity_test_multiple_rows" }, @@ -34832,7 +35102,7 @@ "file_type": "code", "source_file": "tests/test_vector_utils.py", "source_location": "L32", - "community": 131, + "community": 13, "norm_label": ".test_zero_query()", "id": "tests_test_vector_utils_testbatchcosinesimilarity_test_zero_query" }, @@ -34841,7 +35111,7 @@ "file_type": "code", "source_file": "tests/test_vector_utils.py", "source_location": "L38", - "community": 208, + "community": 131, "norm_label": "testcontenthash", "id": "tests_test_vector_utils_testcontenthash" }, @@ -34850,7 +35120,7 @@ "file_type": "code", "source_file": "tests/test_vector_utils.py", "source_location": "L39", - "community": 208, + "community": 131, "norm_label": ".test_deterministic()", "id": "tests_test_vector_utils_testcontenthash_test_deterministic" }, @@ -34859,7 +35129,7 @@ "file_type": "code", "source_file": "tests/test_vector_utils.py", "source_location": "L42", - "community": 208, + "community": 131, "norm_label": ".test_different_inputs()", "id": "tests_test_vector_utils_testcontenthash_test_different_inputs" }, @@ -34868,7 +35138,7 @@ "file_type": "code", "source_file": "tests/test_vector_utils.py", "source_location": "L45", - "community": 208, + "community": 131, "norm_label": ".test_hex_format()", "id": "tests_test_vector_utils_testcontenthash_test_hex_format" }, @@ -36209,7 +36479,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1083", - "community": 16, + "community": 104, "norm_label": "covers lines 114-115: session ownership check fails.", "id": "tests_test_controllers_coverage_rationale_1083" }, @@ -36290,7 +36560,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1223", - "community": 528, + "community": 560, "norm_label": "covers lines 13, 17, 19-20, 22-27: usermanager.addroletouser.", "id": "tests_test_controllers_coverage_rationale_1223" }, @@ -36299,7 +36569,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1226", - "community": 528, + "community": 560, "norm_label": "covers lines 17, 22-27: user found, role not present, role added.", "id": "tests_test_controllers_coverage_rationale_1226" }, @@ -36308,7 +36578,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1243", - "community": 493, + "community": 560, "norm_label": "covers line 27: user already has the role.", "id": "tests_test_controllers_coverage_rationale_1243" }, @@ -36335,7 +36605,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1301", - "community": 493, + "community": 560, "norm_label": "covers lines 42-44: session validation fails.", "id": "tests_test_controllers_coverage_rationale_1301" }, @@ -36371,7 +36641,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1375", - "community": 498, + "community": 524, "norm_label": "covers line 16: empty password raises valueerror.", "id": "tests_test_controllers_coverage_rationale_1375" }, @@ -36398,7 +36668,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1404", - "community": 524, + "community": 544, "norm_label": "covers lines 50-51: jwt.invalidtokenerror.", "id": "tests_test_controllers_coverage_rationale_1404" }, @@ -36533,7 +36803,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L42", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback.", "id": "prometheus_tools_rationale_42" }, @@ -36542,7 +36812,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L79", - "community": 536, + "community": 8, "norm_label": "retrieve values from the harness state. use this to recall intermediate results,", "id": "prometheus_tools_rationale_79" }, @@ -36551,7 +36821,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L147", - "community": 564, + "community": 525, "norm_label": "read a file from the workspace. args: path: path to the file (e.", "id": "prometheus_tools_rationale_147" }, @@ -36569,7 +36839,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_dedup.py", "source_location": "L30", - "community": 140, + "community": 67, "norm_label": "keys with jaccard > 0.8 should merge.", "id": "tests_test_memory_dedup_rationale_30" }, @@ -36578,7 +36848,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_dedup.py", "source_location": "L40", - "community": 140, + "community": 67, "norm_label": "keys with low similarity should not merge.", "id": "tests_test_memory_dedup_rationale_40" }, @@ -36587,7 +36857,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_dedup.py", "source_location": "L67", - "community": 140, + "community": 67, "norm_label": "keys with jaccard <= 0.8 should not merge.", "id": "tests_test_memory_dedup_rationale_67" }, @@ -36857,7 +37127,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L131", - "community": 564, + "community": 525, "norm_label": "read a file from the sandbox filesystem. args: path: absolute pa", "id": "prometheus_tools_rationale_131" }, @@ -37055,7 +37325,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L130", - "community": 564, + "community": 525, "norm_label": "read a file from the sandbox filesystem. args: path: absolute pa", "id": "prometheus_tools_rationale_130" }, @@ -37190,7 +37460,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L41", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback.", "id": "prometheus_tools_rationale_41" }, @@ -37199,7 +37469,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L78", - "community": 536, + "community": 8, "norm_label": "retrieve values from the harness state. use this to recall intermediate results,", "id": "prometheus_tools_rationale_78" }, @@ -39395,7 +39665,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L114", - "community": 536, + "community": 100, "norm_label": "test_get_state_no_state_returns_error()", "id": "tests_test_prometheus_tools_test_get_state_no_state_returns_error" }, @@ -39404,7 +39674,7 @@ "file_type": "code", "source_file": "tests/test_prometheus_tools.py", "source_location": "L119", - "community": 100, + "community": 487, "norm_label": "test_set_state_no_state_returns_error()", "id": "tests_test_prometheus_tools_test_set_state_no_state_returns_error" }, @@ -39440,7 +39710,7 @@ "file_type": "code", "source_file": "main/app/prometheus/cache.py", "source_location": "L1", - "community": 67, + "community": 110, "norm_label": "cache.py", "id": "main_app_prometheus_cache_py" }, @@ -39449,7 +39719,7 @@ "file_type": "code", "source_file": "main/app/prometheus/cache.py", "source_location": "L7", - "community": 67, + "community": 110, "norm_label": "resultcache", "id": "prometheus_cache_resultcache" }, @@ -39458,7 +39728,7 @@ "file_type": "code", "source_file": "main/app/prometheus/cache.py", "source_location": "L8", - "community": 67, + "community": 110, "norm_label": ".__init__()", "id": "prometheus_cache_resultcache_init" }, @@ -39467,7 +39737,7 @@ "file_type": "code", "source_file": "main/app/prometheus/cache.py", "source_location": "L11", - "community": 67, + "community": 110, "norm_label": ".cachepath()", "id": "prometheus_cache_resultcache_cachepath" }, @@ -39476,7 +39746,7 @@ "file_type": "code", "source_file": "main/app/prometheus/cache.py", "source_location": "L15", - "community": 67, + "community": 110, "norm_label": ".get()", "id": "prometheus_cache_resultcache_get" }, @@ -39485,7 +39755,7 @@ "file_type": "code", "source_file": "main/app/prometheus/cache.py", "source_location": "L21", - "community": 67, + "community": 110, "norm_label": ".set()", "id": "prometheus_cache_resultcache_set" }, @@ -39494,7 +39764,7 @@ "file_type": "code", "source_file": "main/app/prometheus/cache.py", "source_location": "L31", - "community": 67, + "community": 110, "norm_label": ".invalidate()", "id": "prometheus_cache_resultcache_invalidate" }, @@ -39503,7 +39773,7 @@ "file_type": "code", "source_file": "main/app/prometheus/cache.py", "source_location": "L38", - "community": 67, + "community": 110, "norm_label": ".exists()", "id": "prometheus_cache_resultcache_exists" }, @@ -39548,7 +39818,7 @@ "file_type": "code", "source_file": "main/app/prometheus/tools.py", "source_location": "L139", - "community": 563, + "community": 495, "norm_label": "read_sandbox_file()", "id": "prometheus_tools_read_sandbox_file" }, @@ -39557,7 +39827,7 @@ "file_type": "code", "source_file": "main/app/prometheus/tools.py", "source_location": "L151", - "community": 563, + "community": 495, "norm_label": "upload_to_sandbox()", "id": "prometheus_tools_upload_to_sandbox" }, @@ -39566,7 +39836,7 @@ "file_type": "code", "source_file": "main/app/prometheus/tools.py", "source_location": "L165", - "community": 563, + "community": 495, "norm_label": "check_cache()", "id": "prometheus_tools_check_cache" }, @@ -39593,7 +39863,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L140", - "community": 563, + "community": 495, "norm_label": "read a file from the sandbox filesystem. args: path: absolute pa", "id": "prometheus_tools_rationale_140" }, @@ -39602,7 +39872,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L152", - "community": 563, + "community": 495, "norm_label": "upload a file to the sandbox filesystem. use this to push data files (csv,", "id": "prometheus_tools_rationale_152" }, @@ -39611,7 +39881,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L166", - "community": 563, + "community": 495, "norm_label": "check if a computed result exists in the cache. use before executing expens", "id": "prometheus_tools_rationale_166" }, @@ -40493,7 +40763,7 @@ "file_type": "code", "source_file": "main/app/prometheus/cache.py", "source_location": "L19", - "community": 67, + "community": 110, "norm_label": "._cache_path()", "id": "prometheus_cache_resultcache_cache_path" }, @@ -40502,7 +40772,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/cache.py", "source_location": "L1", - "community": 67, + "community": 110, "norm_label": "resultcache \u2014 sha256-keyed file-based cache for computed results.", "id": "prometheus_cache_rationale_1" }, @@ -40511,7 +40781,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/cache.py", "source_location": "L10", - "community": 67, + "community": 110, "norm_label": "file-based cache keyed by sha256 of code. stores results as json under:", "id": "prometheus_cache_rationale_10" }, @@ -40520,7 +40790,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/cache.py", "source_location": "L24", - "community": 67, + "community": 110, "norm_label": "return cached result dict or none if miss.", "id": "prometheus_cache_rationale_24" }, @@ -40529,7 +40799,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/cache.py", "source_location": "L31", - "community": 67, + "community": 110, "norm_label": "store result with timestamp.", "id": "prometheus_cache_rationale_31" }, @@ -40538,7 +40808,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/cache.py", "source_location": "L42", - "community": 67, + "community": 110, "norm_label": "delete all cached results for a session.", "id": "prometheus_cache_rationale_42" }, @@ -40547,7 +40817,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/cache.py", "source_location": "L50", - "community": 67, + "community": 110, "norm_label": "check if a result exists for the given code.", "id": "prometheus_cache_rationale_50" }, @@ -40718,7 +40988,7 @@ "file_type": "code", "source_file": "main/models/harness.py", "source_location": "L1", - "community": 101, + "community": 12, "norm_label": "harness.py", "id": "main_models_harness_py" }, @@ -40727,7 +40997,7 @@ "file_type": "code", "source_file": "main/models/harness.py", "source_location": "L7", - "community": 101, + "community": 12, "norm_label": "loopevent", "id": "models_harness_loopevent" }, @@ -40736,7 +41006,7 @@ "file_type": "rationale", "source_file": "main/models/harness.py", "source_location": "L1", - "community": 101, + "community": 12, "norm_label": "loopevent model for observable agent loops.", "id": "models_harness_rationale_1" }, @@ -40745,7 +41015,7 @@ "file_type": "code", "source_file": "tests/test_events.py", "source_location": "L7", - "community": 101, + "community": 12, "norm_label": "testloopeventmodel", "id": "tests_test_events_testloopeventmodel" }, @@ -40754,7 +41024,7 @@ "file_type": "code", "source_file": "tests/test_events.py", "source_location": "L8", - "community": 101, + "community": 12, "norm_label": ".test_create_event()", "id": "tests_test_events_testloopeventmodel_test_create_event" }, @@ -40763,7 +41033,7 @@ "file_type": "code", "source_file": "tests/test_events.py", "source_location": "L14", - "community": 101, + "community": 12, "norm_label": ".test_event_fields()", "id": "tests_test_events_testloopeventmodel_test_event_fields" }, @@ -40772,7 +41042,7 @@ "file_type": "code", "source_file": "tests/test_events.py", "source_location": "L33", - "community": 101, + "community": 12, "norm_label": ".test_nullable_fields()", "id": "tests_test_events_testloopeventmodel_test_nullable_fields" }, @@ -40781,7 +41051,7 @@ "file_type": "code", "source_file": "tests/test_events.py", "source_location": "L43", - "community": 101, + "community": 12, "norm_label": ".test_created_at_auto()", "id": "tests_test_events_testloopeventmodel_test_created_at_auto" }, @@ -40790,7 +41060,7 @@ "file_type": "code", "source_file": "tests/test_events.py", "source_location": "L50", - "community": 101, + "community": 12, "norm_label": ".test_session_id_indexed()", "id": "tests_test_events_testloopeventmodel_test_session_id_indexed" }, @@ -40889,7 +41159,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L77", - "community": 536, + "community": 8, "norm_label": "retrieve values from the harness state. use this to recall intermediate results,", "id": "prometheus_tools_rationale_77" }, @@ -40952,7 +41222,7 @@ "file_type": "code", "source_file": "main/app/prometheus/tools.py", "source_location": "L104", - "community": 536, + "community": 8, "norm_label": "executestatetool()", "id": "prometheus_tools_executestatetool" }, @@ -40970,7 +41240,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L39", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback.", "id": "prometheus_tools_rationale_39" }, @@ -40997,7 +41267,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L54", - "community": 536, + "community": 8, "norm_label": "testexecutestatetool", "id": "tests_test_state_tools_testexecutestatetool" }, @@ -41006,7 +41276,7 @@ "file_type": "code", "source_file": "tests/test_state_tools.py", "source_location": "L84", - "community": 536, + "community": 8, "norm_label": "test_unknown_tool()", "id": "tests_test_state_tools_test_unknown_tool" }, @@ -41033,7 +41303,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/state.py", "source_location": "L22", - "community": 112, + "community": 215, "norm_label": "store a value in state. marks state as changed for context injection.", "id": "prometheus_state_rationale_22" }, @@ -41096,7 +41366,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L38", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback.", "id": "prometheus_tools_rationale_38" }, @@ -41150,7 +41420,7 @@ "file_type": "code", "source_file": "main/app/prometheus/tools.py", "source_location": "L46", - "community": 562, + "community": 84, "norm_label": "executememorytool()", "id": "prometheus_tools_executememorytool" }, @@ -41159,7 +41429,7 @@ "file_type": "rationale", "source_file": "main/app/prometheus/tools.py", "source_location": "L29", - "community": 497, + "community": 208, "norm_label": "store a memory about the user's preferences, analysis results, or feedback.", "id": "prometheus_tools_rationale_29" }, @@ -41168,7 +41438,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_dedup.py", "source_location": "L52", - "community": 140, + "community": 67, "norm_label": "keys with low similarity should not merge.", "id": "tests_test_memory_dedup_rationale_52" }, @@ -41177,7 +41447,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_dedup.py", "source_location": "L85", - "community": 140, + "community": 67, "norm_label": "keys with jaccard <= 0.8 should not merge.", "id": "tests_test_memory_dedup_rationale_85" }, @@ -41294,7 +41564,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L52", - "community": 573, + "community": 49, "norm_label": "makechat must include memory_tools alongside mcp sessions.", "id": "tests_test_memory_tools_wiring_rationale_52" }, @@ -41303,7 +41573,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L89", - "community": 576, + "community": 49, "norm_label": "dispatchtoolcall must route memory tool names to executememorytool.", "id": "tests_test_memory_tools_wiring_rationale_89" }, @@ -41330,7 +41600,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L57", - "community": 573, + "community": 49, "norm_label": "makechat must include memory_tools alongside mcp sessions.", "id": "tests_test_memory_tools_wiring_rationale_57" }, @@ -41339,7 +41609,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L92", - "community": 576, + "community": 49, "norm_label": "dispatchtoolcall must route memory tool names to executememorytool.", "id": "tests_test_memory_tools_wiring_rationale_92" }, @@ -41456,7 +41726,7 @@ "file_type": "code", "source_file": "main/utils/models/loader.py", "source_location": "L23", - "community": 562, + "community": 84, "norm_label": "embed()", "id": "models_loader_embed" }, @@ -41636,7 +41906,7 @@ "file_type": "code", "source_file": "main/utils/models/loader.py", "source_location": "L11", - "community": 562, + "community": 84, "norm_label": "_downloadmodel()", "id": "models_loader_downloadmodel" }, @@ -41780,7 +42050,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1302", - "community": 493, + "community": 560, "norm_label": "covers lines 42-44: session validation fails.", "id": "tests_test_controllers_coverage_rationale_1302" }, @@ -41816,7 +42086,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1376", - "community": 498, + "community": 524, "norm_label": "covers line 16: empty password raises valueerror.", "id": "tests_test_controllers_coverage_rationale_1376" }, @@ -41843,7 +42113,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1405", - "community": 524, + "community": 544, "norm_label": "covers lines 50-51: jwt.invalidtokenerror.", "id": "tests_test_controllers_coverage_rationale_1405" }, @@ -41852,7 +42122,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1417", - "community": 114, + "community": 498, "norm_label": "covers line 67: extracttokenpayload re-raises httpexception from verifyaccesstok", "id": "tests_test_controllers_coverage_rationale_1417" }, @@ -42095,7 +42365,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L56", - "community": 573, + "community": 49, "norm_label": "makechat must include memory_tools alongside mcp sessions.", "id": "tests_test_memory_tools_wiring_rationale_56" }, @@ -42104,7 +42374,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L91", - "community": 576, + "community": 49, "norm_label": "dispatchtoolcall must route memory tool names to executememorytool.", "id": "tests_test_memory_tools_wiring_rationale_91" }, @@ -42122,7 +42392,7 @@ "file_type": "code", "source_file": "main/utils/vector.py", "source_location": "L8", - "community": 131, + "community": 13, "norm_label": "batchcosinesimilarity()", "id": "utils_vector_batchcosinesimilarity" }, @@ -42131,7 +42401,7 @@ "file_type": "code", "source_file": "main/utils/vector.py", "source_location": "L20", - "community": 208, + "community": 131, "norm_label": "contenthash()", "id": "utils_vector_contenthash" }, @@ -42428,7 +42698,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L48", - "community": 573, + "community": 49, "norm_label": "makechat must include memory_tools alongside mcp sessions.", "id": "tests_test_memory_tools_wiring_rationale_48" }, @@ -42437,7 +42707,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_tools_wiring.py", "source_location": "L76", - "community": 576, + "community": 49, "norm_label": "dispatchtoolcall must route memory tool names to executememorytool.", "id": "tests_test_memory_tools_wiring_rationale_76" }, @@ -42491,7 +42761,7 @@ "file_type": "code", "source_file": "main/app/prometheus/agent.py", "source_location": "L91", - "community": 562, + "community": 116, "norm_label": "executememorytool()", "id": "prometheus_agent_executememorytool" }, @@ -42527,7 +42797,7 @@ "file_type": "code", "source_file": "main/controller/prometheus_controller.py", "source_location": "L177", - "community": 562, + "community": 84, "norm_label": "creatememory()", "id": "controller_prometheus_controller_creatememory" }, @@ -42698,7 +42968,7 @@ "file_type": "rationale", "source_file": "main/utils/vector.py", "source_location": "L19", - "community": 208, + "community": 131, "norm_label": "md5 hash for change detection.", "id": "utils_vector_rationale_19" }, @@ -43211,7 +43481,7 @@ "file_type": "code", "source_file": "main/app/prometheus/memory.py", "source_location": "L138", - "community": 13, + "community": 126, "norm_label": "_fulltext_search()", "id": "prometheus_memory_fulltext_search" }, @@ -43337,7 +43607,7 @@ "file_type": "code", "source_file": "main/controller/prometheus_controller.py", "source_location": "L177", - "community": 562, + "community": 84, "norm_label": "create_memory()", "id": "controller_prometheus_controller_create_memory" }, @@ -43382,7 +43652,7 @@ "file_type": "code", "source_file": "main/utils/vector.py", "source_location": "L28", - "community": 131, + "community": 13, "norm_label": "batch_cosine_similarity()", "id": "utils_vector_batch_cosine_similarity" }, @@ -43391,7 +43661,7 @@ "file_type": "code", "source_file": "main/utils/vector.py", "source_location": "L41", - "community": 208, + "community": 131, "norm_label": "content_hash()", "id": "utils_vector_content_hash" }, @@ -43418,7 +43688,7 @@ "file_type": "rationale", "source_file": "main/utils/vector.py", "source_location": "L29", - "community": 131, + "community": 13, "norm_label": "vectorized cosine similarity: one query against n embeddings.", "id": "utils_vector_rationale_29" }, @@ -43427,7 +43697,7 @@ "file_type": "rationale", "source_file": "main/utils/vector.py", "source_location": "L42", - "community": 208, + "community": 131, "norm_label": "md5 hash for change detection.", "id": "utils_vector_rationale_42" }, @@ -43562,7 +43832,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L11", - "community": 140, + "community": 576, "norm_label": "non-extended role gets basic limit.", "id": "tests_test_memory_manager_rationale_11" }, @@ -43580,7 +43850,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L19", - "community": 140, + "community": 581, "norm_label": "admin gets extended limit (has all permissions).", "id": "tests_test_memory_manager_rationale_19" }, @@ -43607,7 +43877,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L43", - "community": 140, + "community": 582, "norm_label": "returns unchanged when value is identical.", "id": "tests_test_memory_manager_rationale_43" }, @@ -43616,7 +43886,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L49", - "community": 140, + "community": 583, "norm_label": "rejects new memory when limit reached.", "id": "tests_test_memory_manager_rationale_49" }, @@ -43625,7 +43895,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L61", - "community": 140, + "community": 584, "norm_label": "no role check when user_roles not provided.", "id": "tests_test_memory_manager_rationale_61" }, @@ -43634,7 +43904,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L69", - "community": 140, + "community": 585, "norm_label": "stores embedding alongside memory.", "id": "tests_test_memory_manager_rationale_69" }, @@ -43661,7 +43931,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L107", - "community": 140, + "community": 575, "norm_label": "returns paginated memories.", "id": "tests_test_memory_manager_rationale_107" }, @@ -43670,7 +43940,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L115", - "community": 140, + "community": 578, "norm_label": "offset and limit work.", "id": "tests_test_memory_manager_rationale_115" }, @@ -43679,7 +43949,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L122", - "community": 140, + "community": 579, "norm_label": "archived memories excluded.", "id": "tests_test_memory_manager_rationale_122" }, @@ -43688,7 +43958,7 @@ "file_type": "rationale", "source_file": "tests/test_memory_manager.py", "source_location": "L135", - "community": 140, + "community": 580, "norm_label": "soft-deletes a memory.", "id": "tests_test_memory_manager_rationale_135" }, @@ -43886,7 +44156,7 @@ "file_type": "rationale", "source_file": "tests/test_vector_utils.py", "source_location": "L68", - "community": 131, + "community": 13, "norm_label": "empty matrix \u2192 empty array.", "id": "tests_test_vector_utils_rationale_68" }, @@ -43895,7 +44165,7 @@ "file_type": "rationale", "source_file": "tests/test_vector_utils.py", "source_location": "L73", - "community": 131, + "community": 13, "norm_label": "single row matches cosine_similarity.", "id": "tests_test_vector_utils_rationale_73" }, @@ -43904,7 +44174,7 @@ "file_type": "rationale", "source_file": "tests/test_vector_utils.py", "source_location": "L80", - "community": 131, + "community": 13, "norm_label": "multiple rows ranked correctly.", "id": "tests_test_vector_utils_rationale_80" }, @@ -43913,7 +44183,7 @@ "file_type": "rationale", "source_file": "tests/test_vector_utils.py", "source_location": "L93", - "community": 131, + "community": 13, "norm_label": "zero query \u2192 all zeros.", "id": "tests_test_vector_utils_rationale_93" }, @@ -43922,7 +44192,7 @@ "file_type": "rationale", "source_file": "tests/test_vector_utils.py", "source_location": "L101", - "community": 208, + "community": 131, "norm_label": "same input \u2192 same hash.", "id": "tests_test_vector_utils_rationale_101" }, @@ -43931,7 +44201,7 @@ "file_type": "rationale", "source_file": "tests/test_vector_utils.py", "source_location": "L105", - "community": 208, + "community": 131, "norm_label": "different inputs \u2192 different hashes.", "id": "tests_test_vector_utils_rationale_105" }, @@ -43940,7 +44210,7 @@ "file_type": "rationale", "source_file": "tests/test_vector_utils.py", "source_location": "L109", - "community": 208, + "community": 131, "norm_label": "returns 32-char hex string.", "id": "tests_test_vector_utils_rationale_109" }, @@ -44930,7 +45200,7 @@ "file_type": "rationale", "source_file": "tests/conftest.py", "source_location": "L74", - "community": 137, + "community": 539, "norm_label": "testclient with stocks router + verifyapikey + getcurrentuser overrides.", "id": "tests_conftest_rationale_74" }, @@ -44939,7 +45209,7 @@ "file_type": "rationale", "source_file": "tests/conftest.py", "source_location": "L99", - "community": 137, + "community": 539, "norm_label": "testclient with all routers mounted \u2014 no lifespan (no db/service init). o", "id": "tests_conftest_rationale_99" }, @@ -45101,7 +45371,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L846", - "community": 99, + "community": 16, "norm_label": "covers lines 33-36: get /prometheus/sessions.", "id": "tests_test_controllers_coverage_rationale_846" }, @@ -45110,7 +45380,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L864", - "community": 99, + "community": 16, "norm_label": "covers line 52: post /prometheus/sessions.", "id": "tests_test_controllers_coverage_rationale_864" }, @@ -45155,7 +45425,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L912", - "community": 104, + "community": 136, "norm_label": "covers lines 77, 83-84, 86: get /prometheus/history/{sessionid}.", "id": "tests_test_controllers_coverage_rationale_912" }, @@ -45164,7 +45434,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L915", - "community": 104, + "community": 136, "norm_label": "covers lines 77, 86: session found with history.", "id": "tests_test_controllers_coverage_rationale_915" }, @@ -45173,7 +45443,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L959", - "community": 104, + "community": 136, "norm_label": "covers lines 83-84: session not found.", "id": "tests_test_controllers_coverage_rationale_959" }, @@ -45218,7 +45488,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1020", - "community": 99, + "community": 16, "norm_label": "covers lines 111-112: sessionid is none, new session created.", "id": "tests_test_controllers_coverage_rationale_1020" }, @@ -45236,7 +45506,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1079", - "community": 16, + "community": 104, "norm_label": "covers lines 114-115: session ownership check fails.", "id": "tests_test_controllers_coverage_rationale_1079" }, @@ -45317,7 +45587,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1219", - "community": 528, + "community": 560, "norm_label": "covers lines 13, 17, 19-20, 22-27: usermanager.addroletouser.", "id": "tests_test_controllers_coverage_rationale_1219" }, @@ -45326,7 +45596,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1222", - "community": 528, + "community": 560, "norm_label": "covers lines 17, 22-27: user found, role not present, role added.", "id": "tests_test_controllers_coverage_rationale_1222" }, @@ -45335,7 +45605,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1239", - "community": 493, + "community": 560, "norm_label": "covers line 27: user already has the role.", "id": "tests_test_controllers_coverage_rationale_1239" }, @@ -45371,7 +45641,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1298", - "community": 493, + "community": 560, "norm_label": "covers lines 42-44: session validation fails.", "id": "tests_test_controllers_coverage_rationale_1298" }, @@ -45416,7 +45686,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1401", - "community": 524, + "community": 544, "norm_label": "covers lines 50-51: jwt.invalidtokenerror.", "id": "tests_test_controllers_coverage_rationale_1401" }, @@ -45425,7 +45695,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1413", - "community": 114, + "community": 498, "norm_label": "covers line 67: extracttokenpayload re-raises httpexception from verifyaccesstok", "id": "tests_test_controllers_coverage_rationale_1413" }, @@ -45713,7 +45983,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L844", - "community": 99, + "community": 16, "norm_label": "covers lines 33-36: get /prometheus/sessions.", "id": "tests_test_controllers_coverage_rationale_844" }, @@ -45722,7 +45992,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L862", - "community": 99, + "community": 16, "norm_label": "covers line 52: post /prometheus/sessions.", "id": "tests_test_controllers_coverage_rationale_862" }, @@ -45767,7 +46037,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L910", - "community": 104, + "community": 136, "norm_label": "covers lines 77, 83-84, 86: get /prometheus/history/{sessionid}.", "id": "tests_test_controllers_coverage_rationale_910" }, @@ -45776,7 +46046,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L913", - "community": 104, + "community": 136, "norm_label": "covers lines 77, 86: session found with history.", "id": "tests_test_controllers_coverage_rationale_913" }, @@ -45785,7 +46055,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L957", - "community": 104, + "community": 136, "norm_label": "covers lines 83-84: session not found.", "id": "tests_test_controllers_coverage_rationale_957" }, @@ -45830,7 +46100,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1018", - "community": 99, + "community": 16, "norm_label": "covers lines 111-112: sessionid is none, new session created.", "id": "tests_test_controllers_coverage_rationale_1018" }, @@ -45848,7 +46118,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1078", - "community": 16, + "community": 104, "norm_label": "covers lines 114-115: session ownership check fails.", "id": "tests_test_controllers_coverage_rationale_1078" }, @@ -45920,7 +46190,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1218", - "community": 528, + "community": 560, "norm_label": "covers lines 13, 17, 19-20, 22-27: usermanager.addroletouser.", "id": "tests_test_controllers_coverage_rationale_1218" }, @@ -45929,7 +46199,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1221", - "community": 528, + "community": 560, "norm_label": "covers lines 17, 22-27: user found, role not present, role added.", "id": "tests_test_controllers_coverage_rationale_1221" }, @@ -45938,7 +46208,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1238", - "community": 493, + "community": 560, "norm_label": "covers line 27: user already has the role.", "id": "tests_test_controllers_coverage_rationale_1238" }, @@ -45974,7 +46244,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1297", - "community": 493, + "community": 560, "norm_label": "covers lines 42-44: session validation fails.", "id": "tests_test_controllers_coverage_rationale_1297" }, @@ -46010,7 +46280,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1371", - "community": 498, + "community": 524, "norm_label": "covers line 16: empty password raises valueerror.", "id": "tests_test_controllers_coverage_rationale_1371" }, @@ -46037,7 +46307,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1400", - "community": 524, + "community": 544, "norm_label": "covers lines 50-51: jwt.invalidtokenerror.", "id": "tests_test_controllers_coverage_rationale_1400" }, @@ -46046,7 +46316,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1412", - "community": 114, + "community": 498, "norm_label": "covers line 67: extracttokenpayload re-raises httpexception from verifyaccesstok", "id": "tests_test_controllers_coverage_rationale_1412" }, @@ -46505,7 +46775,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L496", - "community": 535, + "community": 520, "norm_label": "replacenan handles direct float nan values (line 34).", "id": "tests_test_stocks_api_coverage_rationale_496" }, @@ -46514,7 +46784,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L510", - "community": 126, + "community": 566, "norm_label": "non-json-dict/list string is left as-is.", "id": "tests_test_stocks_api_coverage_rationale_510" }, @@ -46559,7 +46829,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L630", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 77-132.", "id": "tests_test_stocks_api_coverage_rationale_630" }, @@ -46568,7 +46838,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L668", - "community": 566, + "community": 28, "norm_label": "pass field name without year (how categorizecolumns returns them).", "id": "tests_test_stocks_api_coverage_rationale_668" }, @@ -46586,7 +46856,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L737", - "community": 521, + "community": 543, "norm_label": "invalid date format raises exception (line 132).", "id": "tests_test_stocks_api_coverage_rationale_737" }, @@ -46622,7 +46892,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L778", - "community": 21, + "community": 112, "norm_label": "calling with all none returns 400.", "id": "tests_test_stocks_api_coverage_rationale_778" }, @@ -46631,7 +46901,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L789", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 142-202.", "id": "tests_test_stocks_api_coverage_rationale_789" }, @@ -46640,7 +46910,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L843", - "community": 39, + "community": 497, "norm_label": "invalid date -> inner 400 passes through (not wrapped as 500).", "id": "tests_test_stocks_api_coverage_rationale_843" }, @@ -46658,7 +46928,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L905", - "community": 39, + "community": 17, "norm_label": "dataframe without time column.", "id": "tests_test_stocks_api_coverage_rationale_905" }, @@ -46703,7 +46973,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L967", - "community": 17, + "community": 39, "norm_label": "search with no index match falls back to string startswith.", "id": "tests_test_stocks_api_coverage_rationale_967" }, @@ -46721,7 +46991,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L990", - "community": 488, + "community": 570, "norm_label": "cotacao 10y padrao and cotacao 10y ajustada belong to /cotations, not /fundament", "id": "tests_test_stocks_api_coverage_rationale_990" }, @@ -46730,7 +47000,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1017", - "community": 46, + "community": 101, "norm_label": "regression: queryfundamental must not mutate the shared cache time column.", "id": "tests_test_stocks_api_coverage_rationale_1017" }, @@ -46775,7 +47045,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1216", - "community": 543, + "community": 521, "norm_label": "hit the actual /stocks/cotations http endpoint with adjusted=false.", "id": "tests_test_stocks_api_coverage_rationale_1216" }, @@ -46793,7 +47063,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1342", - "community": 136, + "community": 234, "norm_label": "get /stocks/realtime-cotation without search returns 422.", "id": "tests_test_stocks_api_coverage_rationale_1342" }, @@ -46928,7 +47198,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1344", - "community": 136, + "community": 234, "norm_label": "get /stocks/realtime-cotation without search returns 422.", "id": "tests_test_stocks_api_coverage_rationale_1344" }, @@ -47117,7 +47387,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1400", - "community": 136, + "community": 234, "norm_label": "get /stocks/realtime-cotation without search returns 422.", "id": "tests_test_stocks_api_coverage_rationale_1400" }, @@ -47135,7 +47405,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L23", - "community": 21, + "community": 112, "norm_label": "return a small dataframe with the columns the query module expects.", "id": "tests_test_stocks_api_coverage_rationale_23" }, @@ -47270,7 +47540,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L495", - "community": 535, + "community": 520, "norm_label": "replacenan handles direct float nan values (line 34).", "id": "tests_test_stocks_api_coverage_rationale_495" }, @@ -47279,7 +47549,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L509", - "community": 126, + "community": 566, "norm_label": "non-json-dict/list string is left as-is.", "id": "tests_test_stocks_api_coverage_rationale_509" }, @@ -47324,7 +47594,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L629", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 77-132.", "id": "tests_test_stocks_api_coverage_rationale_629" }, @@ -47333,7 +47603,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L667", - "community": 566, + "community": 28, "norm_label": "pass field name without year (how categorizecolumns returns them).", "id": "tests_test_stocks_api_coverage_rationale_667" }, @@ -47360,7 +47630,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L736", - "community": 521, + "community": 543, "norm_label": "invalid date format raises exception (line 132).", "id": "tests_test_stocks_api_coverage_rationale_736" }, @@ -47378,7 +47648,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L762", - "community": 28, + "community": 562, "norm_label": "historical query with a year range.", "id": "tests_test_stocks_api_coverage_rationale_762" }, @@ -47396,7 +47666,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L777", - "community": 21, + "community": 112, "norm_label": "calling with all none returns 400.", "id": "tests_test_stocks_api_coverage_rationale_777" }, @@ -47405,7 +47675,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L788", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 142-202.", "id": "tests_test_stocks_api_coverage_rationale_788" }, @@ -47414,7 +47684,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L895", - "community": 39, + "community": 17, "norm_label": "search.strip() == '' should still dedup (line 181).", "id": "tests_test_stocks_api_coverage_rationale_895" }, @@ -47423,7 +47693,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L904", - "community": 39, + "community": 17, "norm_label": "dataframe without time column.", "id": "tests_test_stocks_api_coverage_rationale_904" }, @@ -47459,7 +47729,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L964", - "community": 17, + "community": 39, "norm_label": "search with no index match falls back to string startswith.", "id": "tests_test_stocks_api_coverage_rationale_964" }, @@ -47477,7 +47747,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L986", - "community": 488, + "community": 570, "norm_label": "cotacao 10y padrao and cotacao 10y ajustada belong to /cotations, not /fundament", "id": "tests_test_stocks_api_coverage_rationale_986" }, @@ -47486,7 +47756,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1013", - "community": 46, + "community": 101, "norm_label": "regression: queryfundamental must not mutate the shared cache time column.", "id": "tests_test_stocks_api_coverage_rationale_1013" }, @@ -47531,7 +47801,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1212", - "community": 543, + "community": 521, "norm_label": "hit the actual /stocks/cotations http endpoint with adjusted=false.", "id": "tests_test_stocks_api_coverage_rationale_1212" }, @@ -47549,7 +47819,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1396", - "community": 136, + "community": 234, "norm_label": "get /stocks/realtime-cotation without search returns 422.", "id": "tests_test_stocks_api_coverage_rationale_1396" }, @@ -47585,7 +47855,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1388", - "community": 136, + "community": 234, "norm_label": "get /stocks/realtime-cotation without search returns 422.", "id": "tests_test_stocks_api_coverage_rationale_1388" }, @@ -47675,7 +47945,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1210", - "community": 543, + "community": 521, "norm_label": "hit the actual /stocks/cotations http endpoint with adjusted=false.", "id": "tests_test_stocks_api_coverage_rationale_1210" }, @@ -47693,7 +47963,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L832", - "community": 39, + "community": 17, "norm_label": "invalid date -> inner 400 caught by outer except -> 500.", "id": "tests_test_stocks_api_coverage_rationale_832" }, @@ -47702,7 +47972,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L885", - "community": 39, + "community": 17, "norm_label": "search.strip() == '' should still dedup (line 181).", "id": "tests_test_stocks_api_coverage_rationale_885" }, @@ -47711,7 +47981,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L894", - "community": 39, + "community": 17, "norm_label": "dataframe without time column.", "id": "tests_test_stocks_api_coverage_rationale_894" }, @@ -47747,7 +48017,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L954", - "community": 17, + "community": 39, "norm_label": "search with no index match falls back to string startswith.", "id": "tests_test_stocks_api_coverage_rationale_954" }, @@ -47765,7 +48035,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L976", - "community": 488, + "community": 570, "norm_label": "cotacao 10y padrao and cotacao 10y ajustada belong to /cotations, not /fundament", "id": "tests_test_stocks_api_coverage_rationale_976" }, @@ -47774,7 +48044,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1003", - "community": 46, + "community": 101, "norm_label": "regression: queryfundamental must not mutate the shared cache time column.", "id": "tests_test_stocks_api_coverage_rationale_1003" }, @@ -47819,7 +48089,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1191", - "community": 543, + "community": 521, "norm_label": "hit the actual /stocks/cotations http endpoint with adjusted=false.", "id": "tests_test_stocks_api_coverage_rationale_1191" }, @@ -48350,7 +48620,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1170", - "community": 543, + "community": 521, "norm_label": "hit the actual /stocks/cotations http endpoint with adjusted=false.", "id": "tests_test_stocks_api_coverage_rationale_1170" }, @@ -48395,7 +48665,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1141", - "community": 543, + "community": 521, "norm_label": "hit the actual /stocks/cotations http endpoint with adjusted=false.", "id": "tests_test_stocks_api_coverage_rationale_1141" }, @@ -48422,7 +48692,7 @@ "file_type": "code", "source_file": "main/app/stocks_api/query.py", "source_location": "L344", - "community": 63, + "community": 101, "norm_label": ".queryrealtimecotation()", "id": "stocks_api_query_stocksquerymanager_queryrealtimecotation" }, @@ -48449,7 +48719,7 @@ "file_type": "rationale", "source_file": "main/app/stocks_api/query.py", "source_location": "L345", - "community": 63, + "community": 101, "norm_label": "fetch live prices for b3 tickers via yfinance. b3 tickers must match", "id": "stocks_api_query_rationale_345" }, @@ -48476,7 +48746,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L1148", - "community": 543, + "community": 521, "norm_label": "hit the actual /stocks/cotations http endpoint with adjusted=false.", "id": "tests_test_stocks_api_coverage_rationale_1148" }, @@ -48620,7 +48890,7 @@ "file_type": "code", "source_file": "main/utils/http_session.py", "source_location": "L18", - "community": 522, + "community": 564, "norm_label": "cleanup()", "id": "utils_http_session_cleanup" }, @@ -48629,7 +48899,7 @@ "file_type": "code", "source_file": "main/utils/pagination.py", "source_location": "L1", - "community": 482, + "community": 500, "norm_label": "pagination.py", "id": "main_utils_pagination_py" }, @@ -48638,7 +48908,7 @@ "file_type": "code", "source_file": "main/utils/pagination.py", "source_location": "L4", - "community": 482, + "community": 500, "norm_label": "paginationparams", "id": "utils_pagination_paginationparams" }, @@ -48647,7 +48917,7 @@ "file_type": "code", "source_file": "main/utils/pagination.py", "source_location": "L5", - "community": 482, + "community": 500, "norm_label": ".__init__()", "id": "utils_pagination_paginationparams_init" }, @@ -48665,7 +48935,7 @@ "file_type": "rationale", "source_file": "tests/conftest.py", "source_location": "L75", - "community": 137, + "community": 539, "norm_label": "testclient with all routers mounted \u2014 no lifespan (no db/service init). o", "id": "tests_conftest_rationale_75" }, @@ -48773,7 +49043,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L236", - "community": 110, + "community": 535, "norm_label": "integration tests for the verifyapikey function.", "id": "tests_test_api_key_quota_atomic_rationale_236" }, @@ -48782,7 +49052,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L269", - "community": 110, + "community": 535, "norm_label": "test api key verification with invalid key.", "id": "tests_test_api_key_quota_atomic_rationale_269" }, @@ -48791,7 +49061,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L280", - "community": 110, + "community": 535, "norm_label": "test api key verification with missing key.", "id": "tests_test_api_key_quota_atomic_rationale_280" }, @@ -48800,7 +49070,7 @@ "file_type": "rationale", "source_file": "tests/test_api_key_quota_atomic.py", "source_location": "L291", - "community": 110, + "community": 535, "norm_label": "test that api key system can be disabled.", "id": "tests_test_api_key_quota_atomic_rationale_291" }, @@ -48890,7 +49160,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L148", - "community": 120, + "community": 498, "norm_label": "covers lines 44-54, 63, 66-71: register success, valueerror, generic exception.", "id": "tests_test_controllers_coverage_rationale_148" }, @@ -48917,7 +49187,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L228", - "community": 120, + "community": 498, "norm_label": "covers lines 87-93, 102: login success and failure paths.", "id": "tests_test_controllers_coverage_rationale_228" }, @@ -49025,7 +49295,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L425", - "community": 120, + "community": 498, "norm_label": "covers lines 155-156, 158, 160-168, 170-177, 179-184, 186, 190-204: googlecallba", "id": "tests_test_controllers_coverage_rationale_425" }, @@ -49205,7 +49475,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L889", - "community": 99, + "community": 16, "norm_label": "covers lines 33-36: get /prometheus/sessions.", "id": "tests_test_controllers_coverage_rationale_889" }, @@ -49214,7 +49484,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L907", - "community": 99, + "community": 16, "norm_label": "covers line 52: post /prometheus/sessions.", "id": "tests_test_controllers_coverage_rationale_907" }, @@ -49259,7 +49529,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L955", - "community": 104, + "community": 136, "norm_label": "covers lines 77, 83-84, 86: get /prometheus/history/{sessionid}.", "id": "tests_test_controllers_coverage_rationale_955" }, @@ -49268,7 +49538,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L958", - "community": 104, + "community": 136, "norm_label": "covers lines 77, 86: session found with history.", "id": "tests_test_controllers_coverage_rationale_958" }, @@ -49277,7 +49547,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1002", - "community": 104, + "community": 136, "norm_label": "covers lines 83-84: session not found.", "id": "tests_test_controllers_coverage_rationale_1002" }, @@ -49322,7 +49592,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1063", - "community": 99, + "community": 16, "norm_label": "covers lines 111-112: sessionid is none, new session created.", "id": "tests_test_controllers_coverage_rationale_1063" }, @@ -49340,7 +49610,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1123", - "community": 16, + "community": 104, "norm_label": "covers lines 114-115: session ownership check fails.", "id": "tests_test_controllers_coverage_rationale_1123" }, @@ -49421,7 +49691,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1280", - "community": 528, + "community": 560, "norm_label": "covers lines 17, 22-27: user found, role not present, role added.", "id": "tests_test_controllers_coverage_rationale_1280" }, @@ -49439,7 +49709,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1356", - "community": 493, + "community": 560, "norm_label": "covers lines 42-44: session validation fails.", "id": "tests_test_controllers_coverage_rationale_1356" }, @@ -49457,7 +49727,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1430", - "community": 498, + "community": 524, "norm_label": "covers line 16: empty password raises valueerror.", "id": "tests_test_controllers_coverage_rationale_1430" }, @@ -49484,7 +49754,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1459", - "community": 524, + "community": 544, "norm_label": "covers lines 50-51: jwt.invalidtokenerror.", "id": "tests_test_controllers_coverage_rationale_1459" }, @@ -49493,7 +49763,7 @@ "file_type": "rationale", "source_file": "tests/test_controllers_coverage.py", "source_location": "L1471", - "community": 114, + "community": 498, "norm_label": "covers line 67: extracttokenpayload re-raises httpexception from verifyaccesstok", "id": "tests_test_controllers_coverage_rationale_1471" }, @@ -49520,7 +49790,7 @@ "file_type": "code", "source_file": "tests/test_http_session_coverage.py", "source_location": "L9", - "community": 522, + "community": 186, "norm_label": ".test_creates_new_session()", "id": "tests_test_http_session_coverage_testgetsession_test_creates_new_session" }, @@ -49529,7 +49799,7 @@ "file_type": "code", "source_file": "tests/test_http_session_coverage.py", "source_location": "L28", - "community": 522, + "community": 564, "norm_label": "testcleanup", "id": "tests_test_http_session_coverage_testcleanup" }, @@ -49538,7 +49808,7 @@ "file_type": "code", "source_file": "tests/test_http_session_coverage.py", "source_location": "L29", - "community": 522, + "community": 564, "norm_label": ".test_cleanup_closes_session()", "id": "tests_test_http_session_coverage_testcleanup_test_cleanup_closes_session" }, @@ -49547,7 +49817,7 @@ "file_type": "code", "source_file": "tests/test_http_session_coverage.py", "source_location": "L37", - "community": 522, + "community": 564, "norm_label": ".test_cleanup_no_session()", "id": "tests_test_http_session_coverage_testcleanup_test_cleanup_no_session" }, @@ -49556,7 +49826,7 @@ "file_type": "code", "source_file": "tests/test_http_session_coverage.py", "source_location": "L46", - "community": 522, + "community": 564, "norm_label": ".test_cleanup_exception_during_close()", "id": "tests_test_http_session_coverage_testcleanup_test_cleanup_exception_during_close" }, @@ -50087,7 +50357,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L494", - "community": 535, + "community": 520, "norm_label": "replacenan handles direct float nan values (line 34).", "id": "tests_test_stocks_api_coverage_rationale_494" }, @@ -50096,7 +50366,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L508", - "community": 126, + "community": 566, "norm_label": "non-json-dict/list string is left as-is.", "id": "tests_test_stocks_api_coverage_rationale_508" }, @@ -50141,7 +50411,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L628", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 77-132.", "id": "tests_test_stocks_api_coverage_rationale_628" }, @@ -50150,7 +50420,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L666", - "community": 566, + "community": 28, "norm_label": "pass field name without year (how categorizecolumns returns them).", "id": "tests_test_stocks_api_coverage_rationale_666" }, @@ -50177,7 +50447,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L735", - "community": 521, + "community": 543, "norm_label": "invalid date format raises exception (line 132).", "id": "tests_test_stocks_api_coverage_rationale_735" }, @@ -50195,7 +50465,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L761", - "community": 28, + "community": 562, "norm_label": "historical query with a year range.", "id": "tests_test_stocks_api_coverage_rationale_761" }, @@ -50213,7 +50483,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L831", - "community": 39, + "community": 497, "norm_label": "invalid date -> inner 400 caught by outer except -> 500.", "id": "tests_test_stocks_api_coverage_rationale_831" }, @@ -50222,7 +50492,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L884", - "community": 39, + "community": 17, "norm_label": "search.strip() == '' should still dedup (line 181).", "id": "tests_test_stocks_api_coverage_rationale_884" }, @@ -50231,7 +50501,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L893", - "community": 39, + "community": 17, "norm_label": "dataframe without time column.", "id": "tests_test_stocks_api_coverage_rationale_893" }, @@ -50276,7 +50546,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L953", - "community": 17, + "community": 39, "norm_label": "search with no index match falls back to string startswith.", "id": "tests_test_stocks_api_coverage_rationale_953" }, @@ -50438,7 +50708,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L731", - "community": 521, + "community": 543, "norm_label": "invalid date format raises exception (line 132).", "id": "tests_test_stocks_api_coverage_rationale_731" }, @@ -50456,7 +50726,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L757", - "community": 28, + "community": 562, "norm_label": "historical query with a year range.", "id": "tests_test_stocks_api_coverage_rationale_757" }, @@ -50474,7 +50744,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L773", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 142-202.", "id": "tests_test_stocks_api_coverage_rationale_773" }, @@ -50483,7 +50753,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L827", - "community": 39, + "community": 497, "norm_label": "invalid date -> inner 400 caught by outer except -> 500.", "id": "tests_test_stocks_api_coverage_rationale_827" }, @@ -50492,7 +50762,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L876", - "community": 39, + "community": 17, "norm_label": "search.strip() == '' should still dedup (line 181).", "id": "tests_test_stocks_api_coverage_rationale_876" }, @@ -50537,7 +50807,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L730", - "community": 521, + "community": 543, "norm_label": "invalid date format raises exception (line 132).", "id": "tests_test_stocks_api_coverage_rationale_730" }, @@ -50555,7 +50825,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L756", - "community": 28, + "community": 562, "norm_label": "historical query with a year range.", "id": "tests_test_stocks_api_coverage_rationale_756" }, @@ -50564,7 +50834,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L772", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 142-202.", "id": "tests_test_stocks_api_coverage_rationale_772" }, @@ -50573,7 +50843,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L826", - "community": 39, + "community": 497, "norm_label": "invalid date -> inner 400 caught by outer except -> 500.", "id": "tests_test_stocks_api_coverage_rationale_826" }, @@ -50609,7 +50879,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L943", - "community": 17, + "community": 39, "norm_label": "search with no index match falls back to string startswith.", "id": "tests_test_stocks_api_coverage_rationale_943" }, @@ -50636,7 +50906,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L582", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 77-132.", "id": "tests_test_stocks_api_coverage_rationale_582" }, @@ -50645,7 +50915,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L620", - "community": 566, + "community": 28, "norm_label": "pass field name without year (how categorizecolumns returns them).", "id": "tests_test_stocks_api_coverage_rationale_620" }, @@ -50672,7 +50942,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L684", - "community": 521, + "community": 543, "norm_label": "invalid date format raises exception (line 132).", "id": "tests_test_stocks_api_coverage_rationale_684" }, @@ -50690,7 +50960,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L710", - "community": 28, + "community": 562, "norm_label": "historical query with a year range.", "id": "tests_test_stocks_api_coverage_rationale_710" }, @@ -50699,7 +50969,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L726", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 142-202.", "id": "tests_test_stocks_api_coverage_rationale_726" }, @@ -50708,7 +50978,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L780", - "community": 39, + "community": 497, "norm_label": "invalid date -> inner 400 caught by outer except -> 500.", "id": "tests_test_stocks_api_coverage_rationale_780" }, @@ -50717,7 +50987,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L828", - "community": 39, + "community": 17, "norm_label": "search.strip() == '' should still dedup (line 181).", "id": "tests_test_stocks_api_coverage_rationale_828" }, @@ -50726,7 +50996,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L837", - "community": 39, + "community": 17, "norm_label": "dataframe without time column.", "id": "tests_test_stocks_api_coverage_rationale_837" }, @@ -50762,7 +51032,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L897", - "community": 17, + "community": 39, "norm_label": "search with no index match falls back to string startswith.", "id": "tests_test_stocks_api_coverage_rationale_897" }, @@ -50771,7 +51041,7 @@ "file_type": "rationale", "source_file": "tests/test_connectivity_coverage.py", "source_location": "L8", - "community": 59, + "community": 574, "norm_label": "checkmysqlconnection \u2014 success, errors, engine=none paths.", "id": "tests_test_connectivity_coverage_rationale_8" }, @@ -50780,7 +51050,7 @@ "file_type": "rationale", "source_file": "tests/test_connectivity_coverage.py", "source_location": "L105", - "community": 59, + "community": 573, "norm_label": "checkserviceconnection \u2014 success, not found, errors.", "id": "tests_test_connectivity_coverage_rationale_105" }, @@ -50807,7 +51077,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L583", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 77-132.", "id": "tests_test_stocks_api_coverage_rationale_583" }, @@ -50816,7 +51086,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L621", - "community": 566, + "community": 28, "norm_label": "pass field name without year (how categorizecolumns returns them).", "id": "tests_test_stocks_api_coverage_rationale_621" }, @@ -50843,7 +51113,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L685", - "community": 521, + "community": 543, "norm_label": "invalid date format raises exception (line 132).", "id": "tests_test_stocks_api_coverage_rationale_685" }, @@ -50861,7 +51131,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L711", - "community": 28, + "community": 562, "norm_label": "historical query with a year range.", "id": "tests_test_stocks_api_coverage_rationale_711" }, @@ -50870,7 +51140,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L727", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 142-202.", "id": "tests_test_stocks_api_coverage_rationale_727" }, @@ -50879,7 +51149,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L781", - "community": 39, + "community": 497, "norm_label": "invalid date -> inner 400 caught by outer except -> 500.", "id": "tests_test_stocks_api_coverage_rationale_781" }, @@ -50888,7 +51158,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L838", - "community": 39, + "community": 17, "norm_label": "dataframe without time column.", "id": "tests_test_stocks_api_coverage_rationale_838" }, @@ -50996,7 +51266,7 @@ "file_type": "code", "source_file": "main/utils/http_session.py", "source_location": "L9", - "community": 162, + "community": 137, "norm_label": "get_session()", "id": "utils_http_session_get_session" }, @@ -51005,7 +51275,7 @@ "file_type": "rationale", "source_file": "main/utils/http_session.py", "source_location": "L10", - "community": 162, + "community": 137, "norm_label": "return a requests.session for the current thread. sessions are created la", "id": "utils_http_session_rationale_10" }, @@ -51014,7 +51284,7 @@ "file_type": "rationale", "source_file": "main/utils/http_session.py", "source_location": "L23", - "community": 522, + "community": 564, "norm_label": "close the main thread's session at interpreter shutdown.", "id": "utils_http_session_rationale_23" }, @@ -51419,7 +51689,7 @@ "file_type": "rationale", "source_file": "main/utils/http_session.py", "source_location": "L9", - "community": 162, + "community": 137, "norm_label": "return a requests.session for the current thread. sessions are created la", "id": "utils_http_session_rationale_9" }, @@ -51887,7 +52157,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L489", - "community": 535, + "community": 520, "norm_label": "replacenan handles direct float nan values (line 34).", "id": "tests_test_stocks_api_coverage_rationale_489" }, @@ -51896,7 +52166,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L503", - "community": 126, + "community": 566, "norm_label": "non-json-dict/list string is left as-is.", "id": "tests_test_stocks_api_coverage_rationale_503" }, @@ -51923,7 +52193,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L577", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 77-132.", "id": "tests_test_stocks_api_coverage_rationale_577" }, @@ -51932,7 +52202,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L615", - "community": 566, + "community": 28, "norm_label": "pass field name without year (how categorizecolumns returns them).", "id": "tests_test_stocks_api_coverage_rationale_615" }, @@ -51950,7 +52220,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L679", - "community": 521, + "community": 543, "norm_label": "invalid date format raises exception (line 132).", "id": "tests_test_stocks_api_coverage_rationale_679" }, @@ -51968,7 +52238,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L705", - "community": 28, + "community": 562, "norm_label": "historical query with a year range.", "id": "tests_test_stocks_api_coverage_rationale_705" }, @@ -51986,7 +52256,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L721", - "community": 21, + "community": 112, "norm_label": "tests covering query.py lines 142-202.", "id": "tests_test_stocks_api_coverage_rationale_721" }, @@ -51995,7 +52265,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L775", - "community": 39, + "community": 497, "norm_label": "invalid date -> inner 400 caught by outer except -> 500.", "id": "tests_test_stocks_api_coverage_rationale_775" }, @@ -52004,7 +52274,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L823", - "community": 39, + "community": 17, "norm_label": "search.strip() == '' should still dedup (line 181).", "id": "tests_test_stocks_api_coverage_rationale_823" }, @@ -52040,7 +52310,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_api_coverage.py", "source_location": "L892", - "community": 17, + "community": 39, "norm_label": "search with no index match falls back to string startswith.", "id": "tests_test_stocks_api_coverage_rationale_892" }, @@ -52058,7 +52328,7 @@ "file_type": "rationale", "source_file": "tests/conftest.py", "source_location": "L62", - "community": 137, + "community": 539, "norm_label": "testclient with all routers mounted \u2014 no lifespan (no db/service init). o", "id": "tests_conftest_rationale_62" }, @@ -52067,7 +52337,7 @@ "file_type": "rationale", "source_file": "tests/conftest.py", "source_location": "L61", - "community": 137, + "community": 539, "norm_label": "testclient with all routers mounted \u2014 no lifespan (no db/service init). o", "id": "tests_conftest_rationale_61" }, @@ -52076,7 +52346,7 @@ "file_type": "rationale", "source_file": "tests/conftest.py", "source_location": "L57", - "community": 137, + "community": 539, "norm_label": "testclient with all routers mounted \u2014 no lifespan (no db/service init). o", "id": "tests_conftest_rationale_57" }, @@ -52085,7 +52355,7 @@ "file_type": "rationale", "source_file": "tests/conftest.py", "source_location": "L49", - "community": 137, + "community": 539, "norm_label": "testclient with all routers mounted \u2014 no lifespan (no db/service init). o", "id": "tests_conftest_rationale_49" }, @@ -52625,7 +52895,7 @@ "file_type": "code", "source_file": "tests/test_stocks_cache.py", "source_location": "L135", - "community": 512, + "community": 522, "norm_label": "testqueryoptimization", "id": "tests_test_stocks_cache_testqueryoptimization" }, @@ -52634,7 +52904,7 @@ "file_type": "code", "source_file": "tests/test_stocks_cache.py", "source_location": "L138", - "community": 512, + "community": 522, "norm_label": ".test_all_optimizations_present()", "id": "tests_test_stocks_cache_testqueryoptimization_test_all_optimizations_present" }, @@ -52643,7 +52913,7 @@ "file_type": "code", "source_file": "tests/test_stocks_cache.py", "source_location": "L153", - "community": 512, + "community": 522, "norm_label": ".test_query_filter_uses_optimization()", "id": "tests_test_stocks_cache_testqueryoptimization_test_query_filter_uses_optimization" }, @@ -52895,7 +53165,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_cache.py", "source_location": "L136", - "community": 512, + "community": 522, "norm_label": "integration tests for all query optimizations", "id": "tests_test_stocks_cache_rationale_136" }, @@ -52904,7 +53174,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_cache.py", "source_location": "L139", - "community": 512, + "community": 522, "norm_label": "all optimizations should be implemented", "id": "tests_test_stocks_cache_rationale_139" }, @@ -52913,7 +53183,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_cache.py", "source_location": "L154", - "community": 512, + "community": 522, "norm_label": "query filter should use ticker index", "id": "tests_test_stocks_cache_rationale_154" }, @@ -53183,7 +53453,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_cache.py", "source_location": "L138", - "community": 512, + "community": 522, "norm_label": "integration tests for all query optimizations", "id": "tests_test_stocks_cache_rationale_138" }, @@ -53192,7 +53462,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_cache.py", "source_location": "L141", - "community": 512, + "community": 522, "norm_label": "all optimizations should be implemented", "id": "tests_test_stocks_cache_rationale_141" }, @@ -53201,7 +53471,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_cache.py", "source_location": "L156", - "community": 512, + "community": 522, "norm_label": "query filter should use ticker index", "id": "tests_test_stocks_cache_rationale_156" }, @@ -53381,7 +53651,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L1", - "community": 503, + "community": 130, "norm_label": "test_stocks_optimization.py", "id": "tests_test_stocks_optimization_py" }, @@ -53498,7 +53768,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L111", - "community": 503, + "community": 130, "norm_label": "testconnectionpool", "id": "tests_test_stocks_optimization_testconnectionpool" }, @@ -53507,7 +53777,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L114", - "community": 503, + "community": 130, "norm_label": ".test_stocks_engine_has_pool_configuration()", "id": "tests_test_stocks_optimization_testconnectionpool_test_stocks_engine_has_pool_configuration" }, @@ -53516,7 +53786,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L123", - "community": 503, + "community": 130, "norm_label": "testlazydeserialization", "id": "tests_test_stocks_optimization_testlazydeserialization" }, @@ -53525,7 +53795,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L126", - "community": 503, + "community": 130, "norm_label": ".test_query_manager_has_deserialize_method()", "id": "tests_test_stocks_optimization_testlazydeserialization_test_query_manager_has_deserialize_method" }, @@ -53534,7 +53804,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L137", - "community": 215, + "community": 130, "norm_label": "testqueryoptimization", "id": "tests_test_stocks_optimization_testqueryoptimization" }, @@ -53543,7 +53813,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L140", - "community": 215, + "community": 130, "norm_label": ".test_all_optimizations_present()", "id": "tests_test_stocks_optimization_testqueryoptimization_test_all_optimizations_present" }, @@ -53552,7 +53822,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L155", - "community": 215, + "community": 130, "norm_label": ".test_query_filter_uses_optimization()", "id": "tests_test_stocks_optimization_testqueryoptimization_test_query_filter_uses_optimization" }, @@ -53624,7 +53894,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L301", - "community": 490, + "community": 130, "norm_label": "testfilterbysearchterms", "id": "tests_test_stocks_optimization_testfilterbysearchterms" }, @@ -53633,7 +53903,7 @@ "file_type": "code", "source_file": "tests/test_stocks_optimization.py", "source_location": "L304", - "community": 490, + "community": 130, "norm_label": ".test_filter_with_tickerindex()", "id": "tests_test_stocks_optimization_testfilterbysearchterms_test_filter_with_tickerIndex" }, @@ -53768,7 +54038,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L112", - "community": 503, + "community": 130, "norm_label": "tests for connection pool configuration", "id": "tests_test_stocks_optimization_rationale_112" }, @@ -53777,7 +54047,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L115", - "community": 503, + "community": 130, "norm_label": "stocks engine should have optimized pool settings", "id": "tests_test_stocks_optimization_rationale_115" }, @@ -53786,7 +54056,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L124", - "community": 503, + "community": 130, "norm_label": "tests for lazy json deserialization", "id": "tests_test_stocks_optimization_rationale_124" }, @@ -53795,7 +54065,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L127", - "community": 503, + "community": 130, "norm_label": "query manager should have deserialize method", "id": "tests_test_stocks_optimization_rationale_127" }, @@ -53804,7 +54074,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L138", - "community": 215, + "community": 130, "norm_label": "integration tests for all query optimizations", "id": "tests_test_stocks_optimization_rationale_138" }, @@ -53813,7 +54083,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L141", - "community": 215, + "community": 130, "norm_label": "all optimizations should be implemented", "id": "tests_test_stocks_optimization_rationale_141" }, @@ -53822,7 +54092,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L156", - "community": 215, + "community": 130, "norm_label": "query filter should use ticker index", "id": "tests_test_stocks_optimization_rationale_156" }, @@ -53894,7 +54164,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L302", - "community": 490, + "community": 130, "norm_label": "tests for optimized search filtering", "id": "tests_test_stocks_optimization_rationale_302" }, @@ -53903,7 +54173,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L305", - "community": 490, + "community": 130, "norm_label": "filter should use ticker index for o(1) lookup", "id": "tests_test_stocks_optimization_rationale_305" }, @@ -53939,7 +54209,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L173", - "community": 490, + "community": 130, "norm_label": "tests for optimized search filtering", "id": "tests_test_stocks_optimization_rationale_173" }, @@ -53948,7 +54218,7 @@ "file_type": "rationale", "source_file": "tests/test_stocks_optimization.py", "source_location": "L176", - "community": 490, + "community": 130, "norm_label": "filter should use ticker index for o(1) lookup", "id": "tests_test_stocks_optimization_rationale_176" }, @@ -54249,7 +54519,7 @@ "label": "FastAPI", "file_type": "rationale", "source_file": "README.md", - "community": 482, + "community": 500, "norm_label": "fastapi", "id": "fastapi" }, @@ -54289,7 +54559,7 @@ "label": "Authentication System", "file_type": "document", "source_file": "docs/authentication.md", - "community": 43, + "community": 491, "norm_label": "authentication system", "id": "authentication" }, @@ -54297,7 +54567,7 @@ "label": "JWT Authentication", "file_type": "rationale", "source_file": "docs/authentication.md", - "community": 43, + "community": 491, "norm_label": "jwt authentication", "id": "jwt" }, @@ -54305,7 +54575,7 @@ "label": "Google OAuth", "file_type": "rationale", "source_file": "docs/authentication.md", - "community": 43, + "community": 491, "norm_label": "google oauth", "id": "google_oauth" }, @@ -77034,192 +77304,192 @@ { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "SWARMS.md", - "source_location": "L1", + "source_file": "TODO.md", + "source_location": "L25", "weight": 1.0, "confidence_score": 1.0, - "source": "swarms_md", - "target": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes" + "source": "todo_md", + "target": "server_todo_user_structure_defined_by_string_roles" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "SWARMS.md", - "source_location": "L6", + "source_file": "TODO.md", + "source_location": "L34", "weight": 1.0, "confidence_score": 1.0, - "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", - "target": "server_swarms_1_prime_owns_the_goal_lanes_own_the_work" + "source": "server_todo_user_structure_defined_by_string_roles", + "target": "server_todo_user" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "SWARMS.md", - "source_location": "L12", + "source_file": "TODO.md", + "source_location": "L37", "weight": 1.0, "confidence_score": 1.0, - "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", - "target": "server_swarms_2_dispatch_delegate_one_per_lane_one_turn" + "source": "server_todo_user_structure_defined_by_string_roles", + "target": "server_todo_premium" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "SWARMS.md", - "source_location": "L20", + "source_file": "TODO.md", + "source_location": "L40", "weight": 1.0, "confidence_score": 1.0, - "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", - "target": "server_swarms_3_delegate_toolsets_vary_verify_each_lane" + "source": "server_todo_user_structure_defined_by_string_roles", + "target": "server_todo_developer" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "SWARMS.md", - "source_location": "L26", + "source_file": "TODO.md", + "source_location": "L67", "weight": 1.0, "confidence_score": 1.0, - "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", - "target": "server_swarms_4_trust_nothing_verify_everything" + "source": "server_todo_user_structure_defined_by_string_roles", + "target": "server_todo_stocks_api" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "SWARMS.md", - "source_location": "L33", + "source_file": "TODO.md", + "source_location": "L70", "weight": 1.0, "confidence_score": 1.0, - "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", - "target": "server_swarms_5_windows_powershell_survival" + "source": "server_todo_user_structure_defined_by_string_roles", + "target": "server_todo_prometheus" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "SWARMS.md", - "source_location": "L39", + "source_file": "docs/authentication.md", + "source_location": "L1", "weight": 1.0, "confidence_score": 1.0, - "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", - "target": "server_swarms_6_finish_per_lane_not_per_swarm" + "source": "docs_authentication_md", + "target": "docs_authentication_authentication_management" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "SWARMS.md", - "source_location": "L45", + "source_file": "docs/authentication.md", + "source_location": "L5", "weight": 1.0, "confidence_score": 1.0, - "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", - "target": "server_swarms_7_standing_bans_this_repo" + "source": "docs_authentication_authentication_management", + "target": "docs_authentication_token_session_lifetime" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "TODO.md", - "source_location": "L25", + "source_file": "docs/authentication.md", + "source_location": "L11", "weight": 1.0, "confidence_score": 1.0, - "source": "todo_md", - "target": "server_todo_user_structure_defined_by_string_roles" + "source": "docs_authentication_authentication_management", + "target": "docs_authentication_token_extraction_order" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "TODO.md", - "source_location": "L34", + "source_file": "docs/authentication.md", + "source_location": "L21", "weight": 1.0, "confidence_score": 1.0, - "source": "server_todo_user_structure_defined_by_string_roles", - "target": "server_todo_user" + "source": "docs_authentication_authentication_management", + "target": "docs_authentication_cookie_handling_conditional_secure" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "TODO.md", - "source_location": "L37", + "source_file": "docs/authentication.md", + "source_location": "L30", "weight": 1.0, "confidence_score": 1.0, - "source": "server_todo_user_structure_defined_by_string_roles", - "target": "server_todo_premium" + "source": "docs_authentication_authentication_management", + "target": "docs_authentication_session_data_model_family_only" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "TODO.md", - "source_location": "L40", + "source_file": "docs/authentication.md", + "source_location": "L39", "weight": 1.0, "confidence_score": 1.0, - "source": "server_todo_user_structure_defined_by_string_roles", - "target": "server_todo_developer" + "source": "docs_authentication_authentication_management", + "target": "docs_authentication_roles_and_permissions" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "TODO.md", - "source_location": "L67", + "source_file": "docs/authentication.md", + "source_location": "L61", "weight": 1.0, "confidence_score": 1.0, - "source": "server_todo_user_structure_defined_by_string_roles", - "target": "server_todo_stocks_api" + "source": "docs_authentication_authentication_management", + "target": "docs_authentication_rate_limits" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "TODO.md", - "source_location": "L70", + "source_file": "docs/authentication.md", + "source_location": "L49", "weight": 1.0, "confidence_score": 1.0, - "source": "server_todo_user_structure_defined_by_string_roles", - "target": "server_todo_prometheus" + "source": "docs_authentication_authentication_management", + "target": "docs_authentication_api_endpoints" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L1", + "source_location": "L117", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_authentication_md", - "target": "docs_authentication_authentication_management" + "source": "docs_authentication_authentication_management", + "target": "docs_authentication_security_features" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L9", + "source_location": "L138", "weight": 1.0, "confidence_score": 1.0, "source": "docs_authentication_authentication_management", - "target": "docs_authentication_usage" + "target": "docs_authentication_not_implemented" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L39", + "source_location": "L154", "weight": 1.0, "confidence_score": 1.0, "source": "docs_authentication_authentication_management", - "target": "docs_authentication_roles_and_permissions" + "target": "docs_authentication_workflow" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L49", + "source_location": "L187", "weight": 1.0, "confidence_score": 1.0, "source": "docs_authentication_authentication_management", - "target": "docs_authentication_api_endpoints" + "target": "docs_authentication_license" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L117", + "source_location": "L9", "weight": 1.0, "confidence_score": 1.0, "source": "docs_authentication_authentication_management", - "target": "docs_authentication_security_features" + "target": "docs_authentication_usage" }, { "relation": "contains", @@ -77245,61 +77515,61 @@ "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L154", + "source_location": "L51", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_authentication_authentication_management", - "target": "docs_authentication_workflow" + "source": "docs_authentication_api_endpoints", + "target": "docs_authentication_health_check" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L187", + "source_location": "L57", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_authentication_authentication_management", - "target": "docs_authentication_license" + "source": "docs_authentication_api_endpoints", + "target": "docs_authentication_user_registration" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L11", + "source_location": "L65", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_authentication_usage", - "target": "docs_authentication_codeblock_1" + "source": "docs_authentication_api_endpoints", + "target": "docs_authentication_user_login" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L51", + "source_location": "L84", "weight": 1.0, "confidence_score": 1.0, "source": "docs_authentication_api_endpoints", - "target": "docs_authentication_health_check" + "target": "docs_authentication_logout" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L57", + "source_location": "L94", "weight": 1.0, "confidence_score": 1.0, "source": "docs_authentication_api_endpoints", - "target": "docs_authentication_user_registration" + "target": "docs_authentication_google_oauth2_login" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L65", + "source_location": "L120", "weight": 1.0, "confidence_score": 1.0, "source": "docs_authentication_api_endpoints", - "target": "docs_authentication_user_login" + "target": "docs_authentication_google_callback_cookie_only" }, { "relation": "contains", @@ -77315,40 +77585,50 @@ "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L84", + "source_location": "L108", "weight": 1.0, "confidence_score": 1.0, "source": "docs_authentication_api_endpoints", - "target": "docs_authentication_logout" + "target": "docs_authentication_google_callback" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L94", + "source_location": "L76", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_authentication_api_endpoints", - "target": "docs_authentication_google_oauth2_login" + "source": "docs_authentication_health_check", + "target": "docs_authentication_codeblock_1" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L108", + "source_location": "L52", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_authentication_api_endpoints", - "target": "docs_authentication_google_callback" + "source": "docs_authentication_health_check", + "target": "docs_authentication_codeblock_2" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L52", + "source_location": "L11", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_authentication_health_check", + "source": "docs_authentication_usage", + "target": "docs_authentication_codeblock_1" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/authentication.md", + "source_location": "L84", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_authentication_user_registration", "target": "docs_authentication_codeblock_2" }, { @@ -77361,6 +77641,16 @@ "source": "docs_authentication_user_registration", "target": "docs_authentication_codeblock_3" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/authentication.md", + "source_location": "L94", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_authentication_user_login", + "target": "docs_authentication_codeblock_3" + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -77375,11 +77665,11 @@ "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L79", + "source_location": "L104", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_authentication_profile_me", - "target": "docs_authentication_codeblock_5" + "source": "docs_authentication_logout", + "target": "docs_authentication_codeblock_4" }, { "relation": "contains", @@ -77391,6 +77681,16 @@ "source": "docs_authentication_logout", "target": "docs_authentication_codeblock_6" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/authentication.md", + "source_location": "L113", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_authentication_google_oauth2_login", + "target": "docs_authentication_codeblock_5" + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -77415,361 +77715,361 @@ "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/authentication.md", - "source_location": "L156", + "source_location": "L79", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_authentication_workflow", - "target": "docs_authentication_codeblock_9" + "source": "docs_authentication_profile_me", + "target": "docs_authentication_codeblock_5" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/prometheus.md", - "source_location": "L1", + "source_file": "docs/authentication.md", + "source_location": "L144", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_prometheus_md", - "target": "docs_prometheus_prometheus" + "source": "docs_authentication_workflow", + "target": "docs_authentication_codeblock_6" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/prometheus.md", - "source_location": "L9", + "source_file": "docs/authentication.md", + "source_location": "L156", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_prometheus_prometheus", - "target": "docs_prometheus_usage" + "source": "docs_authentication_workflow", + "target": "docs_authentication_codeblock_9" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/prometheus.md", - "source_location": "L55", + "source_file": "docs/orunmila.md", + "source_location": "L1", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_prometheus_prometheus", - "target": "docs_prometheus_workflow" + "source": "docs_orunmila_md", + "target": "docs_orunmila_orunmila" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/prometheus.md", - "source_location": "L67", + "source_file": "docs/orunmila.md", + "source_location": "L7", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_prometheus_prometheus", - "target": "docs_prometheus_api_endpoints" + "source": "docs_orunmila_orunmila", + "target": "docs_orunmila_usage" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/prometheus.md", - "source_location": "L74", + "source_file": "docs/orunmila.md", + "source_location": "L53", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_prometheus_prometheus", - "target": "docs_prometheus_license" + "source": "docs_orunmila_orunmila", + "target": "docs_orunmila_workflow" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/prometheus.md", - "source_location": "L11", + "source_file": "docs/orunmila.md", + "source_location": "L65", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_prometheus_usage", - "target": "docs_prometheus_codeblock_1" + "source": "docs_orunmila_orunmila", + "target": "docs_orunmila_api_endpoints" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/prometheus.md", - "source_location": "L51", + "source_file": "docs/orunmila.md", + "source_location": "L72", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_prometheus_usage", - "target": "docs_prometheus_codeblock_2" + "source": "docs_orunmila_orunmila", + "target": "docs_orunmila_license" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/prometheus.md", - "source_location": "L57", + "source_file": "docs/orunmila.md", + "source_location": "L9", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_prometheus_workflow", - "target": "docs_prometheus_codeblock_3" + "source": "docs_orunmila_usage", + "target": "docs_orunmila_codeblock_1" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/scraper_b3.md", - "source_location": "L1", + "source_file": "docs/orunmila.md", + "source_location": "L49", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_md", - "target": "docs_scraper_b3_brazilian_stocks_market_scraper" + "source": "docs_orunmila_usage", + "target": "docs_orunmila_codeblock_2" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/scraper_b3.md", - "source_location": "L5", + "source_file": "docs/orunmila.md", + "source_location": "L55", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_brazilian_stocks_market_scraper", - "target": "docs_scraper_b3_usage" + "source": "docs_orunmila_workflow", + "target": "docs_orunmila_codeblock_3" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/scraper_b3.md", - "source_location": "L27", + "source_location": "L1", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_brazilian_stocks_market_scraper", - "target": "docs_scraper_b3_output_format" + "source": "docs_scraper_b3_md", + "target": "docs_scraper_b3_b3_market_scraper" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/scraper_b3.md", - "source_location": "L55", + "source_location": "L1", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_brazilian_stocks_market_scraper", - "target": "docs_scraper_b3_xang\u00f4" + "source": "docs_scraper_b3_md", + "target": "docs_scraper_b3_brazilian_stocks_market_scraper" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/scraper_b3.md", - "source_location": "L131", + "source_location": "L5", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_brazilian_stocks_market_scraper", - "target": "docs_scraper_b3_license" + "source": "docs_scraper_b3_b3_market_scraper", + "target": "docs_scraper_b3_sources_6" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/scraper_b3.md", - "source_location": "L8", + "source_location": "L19", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_usage", - "target": "docs_scraper_b3_codeblock_1" + "source": "docs_scraper_b3_b3_market_scraper", + "target": "docs_scraper_b3_scheduling_config_config_py_77_81_scraper_service_py_23_36" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/scraper_b3.md", - "source_location": "L29", + "source_location": "L31", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_output_format", - "target": "docs_scraper_b3_mysql_table_b3_stocks" + "source": "docs_scraper_b3_b3_market_scraper", + "target": "docs_scraper_b3_xango_score_main_app_scraper_b3_xango_py" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/scraper_b3.md", - "source_location": "L38", + "source_location": "L41", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_output_format", - "target": "docs_scraper_b3_sample_record" + "source": "docs_scraper_b3_b3_market_scraper", + "target": "docs_scraper_b3_outputs" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/scraper_b3.md", - "source_location": "L40", + "source_location": "L21", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_sample_record", - "target": "docs_scraper_b3_codeblock_2" + "source": "docs_scraper_b3_scheduling_config_config_py_77_81_scraper_service_py_23_36", + "target": "docs_scraper_b3_codeblock_1" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/scraper_b3.md", - "source_location": "L60", + "source_location": "L8", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_xang\u00f4", - "target": "docs_scraper_b3_global_score_function" + "source": "docs_scraper_b3_usage", + "target": "docs_scraper_b3_codeblock_1" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/scraper_b3.md", - "source_location": "L69", + "source_file": "docs/stocks_api.md", + "source_location": "L1", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_xang\u00f4", - "target": "docs_scraper_b3_engines" + "source": "docs_stocks_api_md", + "target": "docs_stocks_api_brazilian_stocks_market_api" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/scraper_b3.md", - "source_location": "L113", + "source_file": "docs/stocks_api.md", + "source_location": "L7", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_xang\u00f4", - "target": "docs_scraper_b3_configuration_parameters" + "source": "docs_stocks_api_brazilian_stocks_market_api", + "target": "docs_stocks_api_usage" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/scraper_b3.md", - "source_location": "L71", + "source_file": "docs/stocks_api.md", + "source_location": "L22", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_engines", - "target": "docs_scraper_b3_profit_quality_gate_m_profit" + "source": "docs_stocks_api_brazilian_stocks_market_api", + "target": "docs_stocks_api_auth" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/scraper_b3.md", - "source_location": "L76", + "source_file": "docs/stocks_api.md", + "source_location": "L32", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_engines", - "target": "docs_scraper_b3_fundamental_engine_phi" + "source": "docs_stocks_api_brazilian_stocks_market_api", + "target": "docs_stocks_api_api_endpoints" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/scraper_b3.md", - "source_location": "L89", + "source_file": "docs/stocks_api.md", + "source_location": "L90", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_engines", - "target": "docs_scraper_b3_risk_quality_engine_omega" + "source": "docs_stocks_api_brazilian_stocks_market_api", + "target": "docs_stocks_api_response_format" }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "docs/scraper_b3.md", - "source_location": "L101", + "source_file": "docs/stocks_api.md", + "source_location": "L119", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_scraper_b3_engines", - "target": "docs_scraper_b3_constraint_engine_lambda" + "source": "docs_stocks_api_brazilian_stocks_market_api", + "target": "docs_stocks_api_architecture" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L1", + "source_location": "L113", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_stocks_api_md", - "target": "docs_stocks_api_brazilian_stocks_market_api" + "source": "docs_stocks_api_brazilian_stocks_market_api", + "target": "docs_stocks_api_license" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L7", + "source_location": "L9", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_stocks_api_brazilian_stocks_market_api", - "target": "docs_stocks_api_usage" + "source": "docs_stocks_api_usage", + "target": "docs_stocks_api_codeblock_1" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L32", + "source_location": "L34", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_stocks_api_brazilian_stocks_market_api", - "target": "docs_stocks_api_api_endpoints" + "source": "docs_stocks_api_api_endpoints", + "target": "docs_stocks_api_health_check" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L90", + "source_location": "L40", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_stocks_api_brazilian_stocks_market_api", - "target": "docs_stocks_api_response_format" + "source": "docs_stocks_api_api_endpoints", + "target": "docs_stocks_api_field_discovery" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L113", + "source_location": "L53", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_stocks_api_brazilian_stocks_market_api", - "target": "docs_stocks_api_license" + "source": "docs_stocks_api_api_endpoints", + "target": "docs_stocks_api_historical_data" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L9", + "source_location": "L72", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_stocks_api_usage", - "target": "docs_stocks_api_codeblock_1" + "source": "docs_stocks_api_api_endpoints", + "target": "docs_stocks_api_fundamental_data" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L34", + "source_location": "L74", "weight": 1.0, "confidence_score": 1.0, "source": "docs_stocks_api_api_endpoints", - "target": "docs_stocks_api_health_check" + "target": "docs_stocks_api_cotations_10_year_daily_history" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L40", + "source_location": "L87", "weight": 1.0, "confidence_score": 1.0, "source": "docs_stocks_api_api_endpoints", - "target": "docs_stocks_api_api_key_verification" + "target": "docs_stocks_api_live_price" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L45", + "source_location": "L98", "weight": 1.0, "confidence_score": 1.0, "source": "docs_stocks_api_api_endpoints", - "target": "docs_stocks_api_key_management" + "target": "docs_stocks_api_mcp_ai_agent_tools" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L53", + "source_location": "L40", "weight": 1.0, "confidence_score": 1.0, "source": "docs_stocks_api_api_endpoints", - "target": "docs_stocks_api_historical_data" + "target": "docs_stocks_api_api_key_verification" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L72", + "source_location": "L45", "weight": 1.0, "confidence_score": 1.0, "source": "docs_stocks_api_api_endpoints", - "target": "docs_stocks_api_fundamental_data" + "target": "docs_stocks_api_key_management" }, { "relation": "contains", @@ -77781,6 +78081,16 @@ "source": "docs_stocks_api_health_check", "target": "docs_stocks_api_codeblock_2" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/stocks_api.md", + "source_location": "L42", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_stocks_api_field_discovery", + "target": "docs_stocks_api_codeblock_3" + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -77795,10 +78105,10 @@ "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/stocks_api.md", - "source_location": "L47", + "source_location": "L50", "weight": 1.0, "confidence_score": 1.0, - "source": "docs_stocks_api_key_management", + "source": "docs_stocks_api_historical_data", "target": "docs_stocks_api_codeblock_4" }, { @@ -77821,6 +78131,26 @@ "source": "docs_stocks_api_historical_data", "target": "docs_stocks_api_codeblock_6" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/stocks_api.md", + "source_location": "L47", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_stocks_api_key_management", + "target": "docs_stocks_api_codeblock_4" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/stocks_api.md", + "source_location": "L63", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_stocks_api_fundamental_data", + "target": "docs_stocks_api_codeblock_5" + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -77841,6 +78171,36 @@ "source": "docs_stocks_api_fundamental_data", "target": "docs_stocks_api_codeblock_8" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/stocks_api.md", + "source_location": "L76", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_stocks_api_cotations_10_year_daily_history", + "target": "docs_stocks_api_codeblock_6" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/stocks_api.md", + "source_location": "L89", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_stocks_api_live_price", + "target": "docs_stocks_api_codeblock_7" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/stocks_api.md", + "source_location": "L106", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_stocks_api_response_format", + "target": "docs_stocks_api_codeblock_8" + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -77895,11 +78255,31 @@ "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/user.md", - "source_location": "L140", + "source_location": "L112", "weight": 1.0, - "confidence_score": 1.0, "source": "docs_user_user_management", - "target": "docs_user_permission_system" + "target": "docs_user_api_keys_stocks_api", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L123", + "weight": 1.0, + "source": "docs_user_user_management", + "target": "docs_user_rate_limits_related_services", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L135", + "weight": 1.0, + "source": "docs_user_user_management", + "target": "docs_user_not_implemented", + "confidence_score": 1.0 }, { "relation": "contains", @@ -77921,6 +78301,16 @@ "source": "docs_user_user_management", "target": "docs_user_license" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L140", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_user_user_management", + "target": "docs_user_permission_system" + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -77945,31 +78335,31 @@ "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/user.md", - "source_location": "L41", + "source_location": "L53", "weight": 1.0, "confidence_score": 1.0, "source": "docs_user_api_endpoints", - "target": "docs_user_upgrade_to_developer_starter" + "target": "docs_user_admin_access" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/user.md", - "source_location": "L47", + "source_location": "L41", "weight": 1.0, "confidence_score": 1.0, "source": "docs_user_api_endpoints", - "target": "docs_user_upgrade_to_developer_enterprise" + "target": "docs_user_upgrade_to_developer_starter" }, { "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/user.md", - "source_location": "L53", + "source_location": "L47", "weight": 1.0, "confidence_score": 1.0, "source": "docs_user_api_endpoints", - "target": "docs_user_admin_access" + "target": "docs_user_upgrade_to_developer_enterprise" }, { "relation": "contains", @@ -78005,21 +78395,11 @@ "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/user.md", - "source_location": "L43", - "weight": 1.0, - "confidence_score": 1.0, - "source": "docs_user_upgrade_to_developer_starter", - "target": "docs_user_codeblock_4" - }, - { - "relation": "contains", - "confidence": "EXTRACTED", - "source_file": "docs/user.md", - "source_location": "L49", + "source_location": "L39", "weight": 1.0, - "confidence_score": 1.0, - "source": "docs_user_upgrade_to_developer_enterprise", - "target": "docs_user_codeblock_5" + "source": "docs_user_admin_access", + "target": "docs_user_codeblock_3", + "confidence_score": 1.0 }, { "relation": "contains", @@ -78071,6 +78451,26 @@ "source": "docs_user_session_management", "target": "docs_user_revoke_all_sessions" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L55", + "weight": 1.0, + "source": "docs_user_list_all_sessions", + "target": "docs_user_codeblock_4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L59", + "weight": 1.0, + "source": "docs_user_list_all_sessions", + "target": "docs_user_codeblock_5", + "confidence_score": 1.0 + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -78091,6 +78491,36 @@ "source": "docs_user_list_all_sessions", "target": "docs_user_codeblock_8" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L43", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_user_upgrade_to_developer_starter", + "target": "docs_user_codeblock_4" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L49", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_user_upgrade_to_developer_enterprise", + "target": "docs_user_codeblock_5" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L83", + "weight": 1.0, + "source": "docs_user_get_current_session", + "target": "docs_user_codeblock_6", + "confidence_score": 1.0 + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -78111,6 +78541,16 @@ "source": "docs_user_get_current_session", "target": "docs_user_codeblock_10" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L91", + "weight": 1.0, + "source": "docs_user_revoke_a_session", + "target": "docs_user_codeblock_7", + "confidence_score": 1.0 + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -78131,6 +78571,26 @@ "source": "docs_user_revoke_a_session", "target": "docs_user_codeblock_12" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L101", + "weight": 1.0, + "source": "docs_user_revoke_all_sessions", + "target": "docs_user_codeblock_8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L105", + "weight": 1.0, + "source": "docs_user_revoke_all_sessions", + "target": "docs_user_codeblock_9", + "confidence_score": 1.0 + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -78155,11 +78615,11 @@ "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/user.md", - "source_location": "L144", + "source_location": "L141", "weight": 1.0, - "confidence_score": 1.0, - "source": "docs_user_permission_system", - "target": "docs_user_codeblock_15" + "source": "docs_user_workflow", + "target": "docs_user_codeblock_10", + "confidence_score": 1.0 }, { "relation": "contains", @@ -81101,6 +81561,316 @@ "source": "specs_2026_09_04_wallet_design_2_decision_design_a_pure_event_log_derive_at_read_time", "target": "specs_2026_09_04_wallet_design_approaches_considered" }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/user.md", + "source_location": "L144", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_user_permission_system", + "target": "docs_user_codeblock_15" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_brazilian_stocks_market_scraper", + "target": "docs_scraper_b3_usage" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_brazilian_stocks_market_scraper", + "target": "docs_scraper_b3_output_format" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L55", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_brazilian_stocks_market_scraper", + "target": "docs_scraper_b3_xang\u00f4" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L131", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_brazilian_stocks_market_scraper", + "target": "docs_scraper_b3_license" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_output_format", + "target": "docs_scraper_b3_mysql_table_b3_stocks" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L38", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_output_format", + "target": "docs_scraper_b3_sample_record" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L40", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_sample_record", + "target": "docs_scraper_b3_codeblock_2" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L60", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_xang\u00f4", + "target": "docs_scraper_b3_global_score_function" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L69", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_xang\u00f4", + "target": "docs_scraper_b3_engines" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L113", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_xang\u00f4", + "target": "docs_scraper_b3_configuration_parameters" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L71", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_engines", + "target": "docs_scraper_b3_profit_quality_gate_m_profit" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L76", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_engines", + "target": "docs_scraper_b3_fundamental_engine_phi" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L89", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_engines", + "target": "docs_scraper_b3_risk_quality_engine_omega" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/scraper_b3.md", + "source_location": "L101", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_scraper_b3_engines", + "target": "docs_scraper_b3_constraint_engine_lambda" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "SWARMS.md", + "source_location": "L1", + "weight": 1.0, + "confidence_score": 1.0, + "source": "swarms_md", + "target": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "SWARMS.md", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", + "target": "server_swarms_1_prime_owns_the_goal_lanes_own_the_work" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "SWARMS.md", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", + "target": "server_swarms_2_dispatch_delegate_one_per_lane_one_turn" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "SWARMS.md", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", + "target": "server_swarms_3_delegate_toolsets_vary_verify_each_lane" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "SWARMS.md", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", + "target": "server_swarms_4_trust_nothing_verify_everything" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "SWARMS.md", + "source_location": "L33", + "weight": 1.0, + "confidence_score": 1.0, + "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", + "target": "server_swarms_5_windows_powershell_survival" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "SWARMS.md", + "source_location": "L39", + "weight": 1.0, + "confidence_score": 1.0, + "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", + "target": "server_swarms_6_finish_per_lane_not_per_swarm" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "SWARMS.md", + "source_location": "L45", + "weight": 1.0, + "confidence_score": 1.0, + "source": "server_swarms_swarms_md_subagent_swarm_playbook_opencode_hermes", + "target": "server_swarms_7_standing_bans_this_repo" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/prometheus.md", + "source_location": "L1", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_prometheus_md", + "target": "docs_prometheus_prometheus" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/prometheus.md", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_prometheus_prometheus", + "target": "docs_prometheus_usage" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/prometheus.md", + "source_location": "L55", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_prometheus_prometheus", + "target": "docs_prometheus_workflow" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/prometheus.md", + "source_location": "L67", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_prometheus_prometheus", + "target": "docs_prometheus_api_endpoints" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/prometheus.md", + "source_location": "L74", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_prometheus_prometheus", + "target": "docs_prometheus_license" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/prometheus.md", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_prometheus_usage", + "target": "docs_prometheus_codeblock_1" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/prometheus.md", + "source_location": "L51", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_prometheus_usage", + "target": "docs_prometheus_codeblock_2" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "docs/prometheus.md", + "source_location": "L57", + "weight": 1.0, + "confidence_score": 1.0, + "source": "docs_prometheus_workflow", + "target": "docs_prometheus_codeblock_3" + }, { "relation": "contains", "confidence": "EXTRACTED", @@ -137796,5 +138566,5 @@ "label": "User Authentication & Authorization" } ], - "built_at_commit": "f4e8f0bce3d22a58279ac3f5f92136d2852c9e9d" + "built_at_commit": "1e23e042a1d9f77378b2a7b41af794104d4cb397" } \ No newline at end of file diff --git a/graphify-out/manifest.json b/graphify-out/manifest.json index dd4c3ce..2089ec2 100644 --- a/graphify-out/manifest.json +++ b/graphify-out/manifest.json @@ -545,33 +545,33 @@ "semantic_hash": "" }, "D:\\Repositories\\server\\TODO.md": { - "mtime": 1789314412.2992828, - "ast_hash": "24bf5288ec1e573ec1172899b4dd2e8e", + "mtime": 1789491365.7767086, + "ast_hash": "6dfb9e567bc2159601d0999f9dcfd48c", "semantic_hash": "" }, "D:\\Repositories\\server\\docs\\authentication.md": { - "mtime": 1789266824.5593731, - "ast_hash": "49c929ebabc766625ade6dd121a02e00", + "mtime": 1789492087.5691185, + "ast_hash": "9febbdf27720d811a9bf0ea416811aba", "semantic_hash": "" }, - "D:\\Repositories\\server\\docs\\prometheus.md": { - "mtime": 1789266824.5603762, - "ast_hash": "8f58627eb4b1d6e8a58812524cc8b52b", + "D:\\Repositories\\server\\docs\\orunmila.md": { + "mtime": 1789492096.4916055, + "ast_hash": "3e1e793d2afb4de361ef54cd848bd807", "semantic_hash": "" }, "D:\\Repositories\\server\\docs\\scraper_b3.md": { - "mtime": 1789266824.5613787, - "ast_hash": "e738bb4fb21995b73d648082cd771e05", + "mtime": 1789492064.7238522, + "ast_hash": "0623c5ca21b30214a135d53a6391721e", "semantic_hash": "" }, "D:\\Repositories\\server\\docs\\stocks_api.md": { - "mtime": 1789266824.5623827, - "ast_hash": "d7930d24514eda65501444d29b96ab9a", + "mtime": 1789492079.7291944, + "ast_hash": "c3312ead4cfa7087999bb95884aa57ca", "semantic_hash": "" }, "D:\\Repositories\\server\\docs\\user.md": { - "mtime": 1789266824.5653808, - "ast_hash": "fd513cedaa40e0d9719ff106ce363256", + "mtime": 1789492113.860849, + "ast_hash": "5ba8841be468b3fc608791e2f2ad6145", "semantic_hash": "" }, "D:\\Repositories\\server\\docs\\superpowers\\plans\\2026-08-09-sse-resume.md": {