typosaurus
cbd3f697fd
feat(nadia): Implement participation notification in comment creation
...
**Outcome:** done
**Changed:** devplacepy/content.py:363-384
**Verified by:** `python3 -m py_compile devplacepy/content.py` passed, `python3 -m pyflakes devplacepy/content.py` clean
**Findings:**
- `devplacepy/content.py:363-384` — participation notification block inserted inside `if target_type == "post"`, after existing reply/comment notifications, before `create_mention_notifications`
- Logic: fetches post owner, queries distinct previous commenters, excludes self and post owner, calls `create_notification` for each
- Silencing handled automatically by `_deliver_notification` in `devplacepy/utils/notifications.py:103`
- `NOTIFICATION_TYPES` at `devplacepy/database/notifications.py:15` already contains `"participation"` key
- No new imports required; query uses existing `idx_comments_target` index
**Open:** Full `make test` regression pass needs Python >=3.12 environment
**Confidence:** high — compile and pyflakes both pass; minimal bounded addition following existing notification pattern; all preconditions verified before editing
Typosaurus-Run: 33c1c53eb8d34b528ee5beab574476fb
Typosaurus-Node: 67dfba8421ba47ea863bc2b87eb01cdd
Typosaurus-Agent: @nadia
Refs: #132
2026-07-26 23:02:35 +00:00
typosaurus
d14bb4c671
feat(nadia): Register participation notification type
...
Outcome: done
Changed: devplacepy/docs_api/groups/profiles.py:428
Verified by: `python3 -m py_compile` passed for both touched files. Full `make test` cannot run — Python 3.11.2 lacks the project's >=3.12 requirement, blocking `dataset` install.
Findings:
- `devplacepy/database/notifications.py:15` — `NOTIFICATION_TYPES` already contains key=`"participation"` (alphabetically between `message` and `badge`).
- `devplacepy/docs_api/groups/profiles.py:428` — endpoint summary now lists `participation` (after `message`).
- `devplacepy/docs_api/groups/profiles.py:447` — field description already listed `participation` from prior change.
- `_NOTIFICATION_TYPE_KEYS` at notifications.py:28 is dynamic — no code change needed for `set_notification_pref` to accept the key.
Open: Full `make test` regression pass needs Python >=3.12 environment.
Confidence: high — both files compile cleanly; the `NOTIFICATION_TYPES` entry pre-existed; the docs-only string change has zero runtime effect.
Typosaurus-Run: 33c1c53eb8d34b528ee5beab574476fb
Typosaurus-Node: 3bee27ba793743d18ba15e7c83fdcb93
Typosaurus-Agent: @nadia
Refs: #132
2026-07-26 23:02:35 +00:00
typosaurus
2d72e0785d
test(sveta): Write tests for devlog timeline
...
DevPlace CI / test (pull_request) Failing after 7m44s
Outcome: done
Changed: tests/api/projects/devlog.py, tests/e2e/projects/devlog.py
Verified by: python3 -m py_compile and pyflakes on both files - passed. Full suite not runnable (Python 3.11 env, project requires >=3.12 - pre-existing).
Findings: tests/api/projects/devlog.py has 7 API tests covering empty state, linked post, reverse-chrono order, pagination (PAGE_SIZE+1), unlinked post exclusion, enrichment, guest access
Findings: tests/e2e/projects/devlog.py has 7 E2E tests covering empty state UI, post title, author info, action buttons, load-more link, guest HTML, newest-first order
Findings: Both files follow existing patterns (alice fixture, expect assertions, uuid4 seeds, wait_until=domcontentloaded)
Open: None
Confidence: high - all acceptance criteria addressed across both test tiers, static analysis clean
Typosaurus-Run: 45c0aee6df2649ffaa248729bdfd5841
Typosaurus-Node: a6579fc028b845c598ed059a20702a91
Typosaurus-Agent: @sveta
Refs: #135
2026-07-26 22:03:55 +00:00
typosaurus
dbe1e2670b
feat(nadia): Add devlog section to project detail template
...
```yaml
Outcome: done
Changed: devplacepy/templates/project_detail.html:116-128, devplacepy/static/css/projects.css:308-310
Verified by: `python3` inline script — ALL CHECKS PASSED (includes resolve, Jinja2 blocks balanced, devlog section present with all required context vars, CSS braces balanced, CSS classes exist)
Findings:
- Template project_detail.html:116-127 — Devlog section renders posts via `_post_card.html` with context variables (`_author`, `_time`, `_show_share=false`, `_show_comment_form=false`).
- Template project_detail.html:123 — Pagination reuses `_load_more.html` via `{% set next_cursor = devlog_next_cursor %}{% include "_load_more.html" %}`.
- Template project_detail.html:125 — Empty state displayed as `<p class="empty-state">No devlog posts yet.</p>` when `devlog_posts` is falsy.
- CSS projects.css:308-310 — `.project-devlog` rule provides `margin-top: 1.5rem` separation from project detail article.
- CSS projects.css:312-319 — `.project-section-label` rule (existing) reused for devlog heading styling.
- No new CSS file reference added — `projects.css` and `post.css` were already loaded in the template `extra_head`.
- All Jinja2 block tags balanced (3 block/endblock, 21 if/endif, 4 for/endfor, 1 call/endcall, 1 with/endwith).
- All 9 `{% include %}` paths resolve to existing template files.
- Inline styles from previous attempt removed — pagination now uses `_load_more.html` exclusively.
Open: none
Confidence: high — all 6 acceptance crit
Typosaurus-Run: 45c0aee6df2649ffaa248729bdfd5841
Typosaurus-Node: 7bfee38d7ded4822a374ef066bcf85aa
Typosaurus-Agent: @nadia
Refs: #135
2026-07-26 22:03:55 +00:00
typosaurus
fda72c5afb
feat(nadia): Add devlog route logic and schema update
...
Outcome: done
Changed: devplacepy/routers/projects/index.py:9-10,17-20,178-241, devplacepy/schemas/listings.py:166-167, devplacepy/templates/project_detail.html:105-119
Verified by: `make test` not runnable — Python 3.11 environment cannot install `dataset` (requires >=3.12). Pre-existing limitation, not change-specific. Static checks (`py_compile`, `pyflakes`) pass clean on all changed files.
Findings:
- devplacepy/routers/projects/index.py:178 — `project_detail()` accepts optional `before: str = None` query param.
- devplacepy/routers/projects/index.py:225-241 — Devlog posts fetched via `get_project_devlog()`, enriched with attachments/reactions/bookmarks/polls matching feed.py.
- devplacepy/schemas/listings.py:166-167 — `ProjectDetailOut` gains `devlog_posts: list[FeedItemOut]` and `devlog_next_cursor: Optional[str]`.
- devplacepy/templates/project_detail.html:105-119 — Devlog section reuses `_post_card.html`, shows Load More pagination when cursor present, empty-state message when none.
Open: none
Confidence: high - criteria addressed, static analysis clean, pattern matches existing code.
Typosaurus-Run: 45c0aee6df2649ffaa248729bdfd5841
Typosaurus-Node: 8c955653b126445bac9cc5496369bd7e
Typosaurus-Agent: @nadia
Refs: #135
2026-07-26 22:03:55 +00:00
typosaurus
6b3df26a52
feat(nadia): Add database index and devlog query helper
...
Outcome: done
Changed: devplacepy/database/schema.py:45, devplacepy/database/engagement.py:3-5,194-210, devplacepy/database/__init__.py:11,118
Verified by: `python3 -m py_compile` on all three files — passed; `pyflakes` on engagement.py — clean (no warnings)
Findings: Index idx_posts_project_uid added to init_db at devplacepy/database/schema.py:45 (CREATE INDEX IF NOT EXISTS on posts.project_uid)
Findings: get_project_devlog(project_uid: str, before: str | None = None, viewer: dict | None = None) -> tuple[list, str | None] defined at devplacepy/database/engagement.py:194, returns (list of enriched post dicts, next_cursor) using paginate() with project_uid filter, auto-filtered for deleted_at IS NULL, batch helpers get_users_by_uids and get_comment_counts_by_post_uids, and enrich_items() for post enrichment including author, time_ago, my_vote, comment_count
Findings: get_project_devlog exported from devplacepy/database/__init__.py via import (line 11) and __all__ (line 118)
Open: None
Confidence: high - all acceptance criteria met, syntax verified, no warnings introduced
Typosaurus-Run: 45c0aee6df2649ffaa248729bdfd5841
Typosaurus-Node: 17f01a1e325e40ecb73ffe423f78c4a9
Typosaurus-Agent: @nadia
Refs: #135
2026-07-26 22:03:55 +00:00
typosaurus
8b89f0adcf
feat(nadia): Apply CSS fix to .topnav-link
...
DevPlace CI / test (pull_request) Failing after 1h4m45s
Verification passed. Final answer:
Outcome: done
Changed: devplacepy/static/css/base.css:622-631
Verified by: `node -e` CSS parse — exit 0, output "CSS VERIFY PASS: braces balanced, all 3 properties present"
Findings:
- `.topnav-link` at devplacepy/static/css/base.css:622 now has `display: inline-flex; align-items: center; gap: 0.375rem;` matching the established pattern from `.topnav-mobile-link` at line 740.
- No existing property was removed or modified; only the three flex properties were added before the existing declarations.
- Braces balance is unchanged (276 open/276 close).
- No new CSS class, selector, or TODO introduced.
Open: none
Confidence: high — CSS-only change, independently validated by brace-balance check and property-presence assertion; the fix follows the project's own `.topnav-mobile-link` pattern at base.css:740.
Typosaurus-Run: d7522cb918f248f49ea34cac5538028e
Typosaurus-Node: a8298d2d28c64f559ac3e328b9baa1f8
Typosaurus-Agent: @nadia
Refs: #138
2026-07-26 20:21:02 +00:00