https://github.com/ben1441/ahoum-backend
· scanned 2026-06-17 01:38 UTC (1 month, 2 weeks ago)
13 raw signals (0 security + 13 graph)
Last scanned 1 month, 2 weeks ago · v2 · last Δ +3.3 (diff) · 10 actionable findings from 1 signal source. 3 repeated signals grouped for readability. Security checks, system graph analysis, and verified AI-agent feedback are merged into one review queue.
All 355 nodes from the latest scan, grouped by kind. Each node is a unit the engine identified (file, function, endpoint, table…). Most users won't need this view — it's primarily for debugging the engine's graph extraction or for AI agents that want to enumerate the project structure.
| Label | Layer | Status | Path |
|---|---|---|---|
main |
software | healthy | manage.py:6 |
test_seeker_can_enroll |
software | healthy | tests/test_enrollments.py:14 |
test_double_enroll_returns_409 |
software | healthy | tests/test_enrollments.py:22 |
test_enroll_respects_capacity |
software | healthy | tests/test_enrollments.py:30 |
test_unlimited_capacity_never_full |
software | healthy | tests/test_enrollments.py:39 |
test_cannot_enroll_in_started_event |
software | healthy | tests/test_enrollments.py:47 |
test_facilitator_cannot_enroll |
software | healthy | tests/test_enrollments.py:59 |
test_cancel_then_reenroll |
software | healthy | tests/test_enrollments.py:65 |
test_cancel_when_not_enrolled_returns_409 |
software | healthy | tests/test_enrollments.py:79 |
test_enroll_nonexistent_event_404 |
software | healthy | tests/test_enrollments.py:86 |
test_list_upcoming_and_past_enrollments |
software | healthy | tests/test_enrollments.py:94 |
test_canceled_enrollment_not_listed |
software | healthy | tests/test_enrollments.py:116 |
api |
software | healthy | tests/conftest.py:10 |
signup_user |
software | healthy | tests/conftest.py:15 |
_signup |
software | healthy | tests/conftest.py:19 |
seeker |
software | healthy | tests/conftest.py:31 |
facilitator |
software | healthy | tests/conftest.py:36 |
_auth |
software | healthy | tests/conftest.py:40 |
seeker_client |
software | healthy | tests/conftest.py:51 |
facilitator_client |
software | healthy | tests/conftest.py:57 |
as_user |
software | healthy | tests/conftest.py:62 |
_make |
software | healthy | tests/conftest.py:65 |
test_signup_creates_unverified_user_and_sends_otp |
software | healthy | tests/test_auth.py:16 |
test_signup_rejects_weak_password |
software | healthy | tests/test_auth.py:28 |
test_signup_duplicate_email_is_silent |
software | healthy | tests/test_auth.py:34 |
test_verify_email_happy_path |
software | healthy | tests/test_auth.py:42 |
test_verify_email_wrong_code_increments_attempts |
software | healthy | tests/test_auth.py:49 |
test_verify_email_max_attempts_locks_code |
software | healthy | tests/test_auth.py:58 |
test_verify_email_expired_code |
software | healthy | tests/test_auth.py:67 |
test_resend_otp_cooldown_is_silent |
software | healthy | tests/test_auth.py:77 |
test_resend_otp_unknown_email_is_silent |
software | healthy | tests/test_auth.py:87 |
test_unverified_user_cannot_login |
software | healthy | tests/test_auth.py:93 |
_make_verified_user |
software | healthy | tests/test_auth.py:100 |
test_login_returns_token_pair_and_refresh_rotates |
software | healthy | tests/test_auth.py:108 |
test_login_invalid_credentials |
software | healthy | tests/test_auth.py:119 |
test_otp_is_stored_hashed_not_plaintext |
software | healthy | tests/test_auth.py:126 |
test_me_endpoint_requires_auth_and_returns_role |
software | healthy | tests/test_auth.py:133 |
test_validation_error_shape |
software | healthy | tests/test_error_contract.py:11 |
test_not_authenticated_shape |
software | healthy | tests/test_error_contract.py:19 |
test_permission_denied_shape |
software | healthy | tests/test_error_contract.py:26 |
test_not_found_shape |
software | healthy | tests/test_error_contract.py:32 |
test_method_not_allowed_shape |
software | healthy | tests/test_error_contract.py:38 |
test_invalid_token_shape |
software | healthy | tests/test_error_contract.py:45 |
_enroll |
software | healthy | tests/test_notifications.py:16 |
test_follow_up_sent_after_one_hour |
software | healthy | tests/test_notifications.py:23 |
test_follow_up_not_sent_before_one_hour |
software | healthy | tests/test_notifications.py:37 |
test_follow_up_is_idempotent_across_runs |
software | healthy | tests/test_notifications.py:44 |
test_reminder_sent_within_hour_window |
software | healthy | tests/test_notifications.py:61 |
test_reminder_not_sent_outside_window |
software | healthy | tests/test_notifications.py:72 |
test_reminder_is_idempotent_across_runs |
software | healthy | tests/test_notifications.py:82 |
Showing first 50 of this kind. Full payload available via the JSON button at the top of the page.
| Label | Layer | Status | Path |
|---|---|---|---|
.env.example |
software | healthy | .env.example |
Procfile |
software | healthy | Procfile |
README.md |
software | healthy | README.md |
pyproject.toml |
software | healthy | pyproject.toml |
Makefile |
software | healthy | Makefile |
docker-compose.yml |
software | healthy | docker-compose.yml |
render.yaml |
software | healthy | render.yaml |
manage.py |
software | healthy | manage.py |
Dockerfile |
software | healthy | Dockerfile |
test_enrollments.py |
software | healthy | tests/test_enrollments.py |
conftest.py |
software | healthy | tests/conftest.py |
test_auth.py |
software | healthy | tests/test_auth.py |
__init__.py |
software | healthy | tests/__init__.py |
test_error_contract.py |
software | healthy | tests/test_error_contract.py |
test_notifications.py |
software | healthy | tests/test_notifications.py |
test_events.py |
software | healthy | tests/test_events.py |
test_concurrency.py |
software | healthy | tests/test_concurrency.py |
factories.py |
software | healthy | tests/factories.py |
ci.yml |
software | healthy | .github/workflows/ci.yml |
postman_collection.json |
software | healthy | docs/postman_collection.json |
architecture.md |
software | healthy | docs/architecture.md |
__init__.py |
software | healthy | apps/__init__.py |
admin.py |
software | healthy | apps/enrollments/admin.py |
views.py |
software | healthy | apps/enrollments/views.py |
__init__.py |
software | healthy | apps/enrollments/__init__.py |
models.py |
software | healthy | apps/enrollments/models.py |
services.py |
software | healthy | apps/enrollments/services.py |
apps.py |
software | healthy | apps/enrollments/apps.py |
serializers.py |
software | healthy | apps/enrollments/serializers.py |
urls.py |
software | healthy | apps/enrollments/urls.py |
__init__.py |
software | healthy | apps/enrollments/migrations/__init__.py |
0001_initial.py |
software | healthy | apps/enrollments/migrations/0001_initial.py |
admin.py |
software | healthy | apps/accounts/admin.py |
views.py |
software | healthy | apps/accounts/views.py |
permissions.py |
software | healthy | apps/accounts/permissions.py |
__init__.py |
software | healthy | apps/accounts/__init__.py |
models.py |
software | healthy | apps/accounts/models.py |
services.py |
software | healthy | apps/accounts/services.py |
apps.py |
software | healthy | apps/accounts/apps.py |
serializers.py |
software | healthy | apps/accounts/serializers.py |
urls.py |
software | healthy | apps/accounts/urls.py |
__init__.py |
software | healthy | apps/accounts/migrations/__init__.py |
0001_initial.py |
software | healthy | apps/accounts/migrations/0001_initial.py |
0002_roles_and_email_unique.py |
software | healthy | apps/accounts/migrations/0002_roles_and_email_unique.py |
pagination.py |
software | healthy | apps/common/pagination.py |
__init__.py |
software | healthy | apps/common/__init__.py |
models.py |
software | healthy | apps/common/models.py |
apps.py |
software | healthy | apps/common/apps.py |
urls.py |
software | healthy | apps/common/urls.py |
exceptions.py |
software | healthy | apps/common/exceptions.py |
Showing first 50 of this kind. Full payload available via the JSON button at the top of the page.
| Label | Layer | Status | Path |
|---|---|---|---|
CapacityRaceTest |
software | healthy | tests/test_concurrency.py:21 |
EventFactory |
software | healthy | tests/factories.py:41 |
Meta |
software | healthy | tests/factories.py:56 |
EnrollmentFactory |
software | healthy | tests/factories.py:55 |
EnrollmentAdmin |
software | healthy | apps/enrollments/admin.py:7 |
EnrollmentViewSet |
software | healthy | apps/enrollments/views.py:12 |
Enrollment |
software | healthy | apps/enrollments/models.py:8 |
Status |
software | healthy | apps/enrollments/models.py:17 |
Meta |
software | healthy | apps/enrollments/models.py:28 |
EnrollmentsConfig |
software | healthy | apps/enrollments/apps.py:4 |
EnrollmentSerializer |
software | healthy | apps/enrollments/serializers.py:8 |
Meta |
software | healthy | apps/enrollments/serializers.py:11 |
Migration |
software | healthy | apps/enrollments/migrations/0001_initial.py:8 |
ProfileAdmin |
software | healthy | apps/accounts/admin.py:7 |
EmailOTPAdmin |
software | healthy | apps/accounts/admin.py:14 |
SignupView |
software | healthy | apps/accounts/views.py:21 |
VerifyEmailView |
software | healthy | apps/accounts/views.py:33 |
ResendOTPView |
software | healthy | apps/accounts/views.py:44 |
LoginView |
software | healthy | apps/accounts/views.py:55 |
MeView |
software | healthy | apps/accounts/views.py:65 |
IsSeeker |
software | healthy | apps/accounts/permissions.py:23 |
IsFacilitator |
software | healthy | apps/accounts/permissions.py:30 |
IsEventOwnerOrReadOnly |
software | healthy | apps/accounts/permissions.py:37 |
Role |
software | healthy | apps/accounts/models.py:8 |
Profile |
software | healthy | apps/accounts/models.py:13 |
EmailOTP |
software | healthy | apps/accounts/models.py:30 |
Purpose |
software | healthy | apps/accounts/models.py:33 |
Meta |
software | healthy | apps/accounts/models.py:45 |
AccountsConfig |
software | healthy | apps/accounts/apps.py:4 |
SignupSerializer |
software | healthy | apps/accounts/serializers.py:13 |
VerifyEmailSerializer |
software | healthy | apps/accounts/serializers.py:23 |
ResendOTPSerializer |
software | healthy | apps/accounts/serializers.py:28 |
LoginSerializer |
software | healthy | apps/accounts/serializers.py:32 |
MeSerializer |
software | healthy | apps/accounts/serializers.py:56 |
Meta |
software | healthy | apps/accounts/serializers.py:60 |
Migration |
software | healthy | apps/accounts/migrations/0001_initial.py:8 |
Migration |
software | healthy | apps/accounts/migrations/0002_roles_and_email_unique.py:25 |
DefaultPagination |
software | healthy | apps/common/pagination.py:4 |
TimeStampedModel |
software | healthy | apps/common/models.py:4 |
Meta |
software | healthy | apps/common/models.py:8 |
CommonConfig |
software | healthy | apps/common/apps.py:4 |
ErrorCode |
software | healthy | apps/common/errors.py:11 |
DomainError |
software | healthy | apps/common/errors.py:35 |
EmailNotVerified |
software | healthy | apps/common/errors.py:42 |
InvalidCredentials |
software | healthy | apps/common/errors.py:48 |
OTPInvalid |
software | healthy | apps/common/errors.py:54 |
OTPExpired |
software | healthy | apps/common/errors.py:59 |
OTPMaxAttempts |
software | healthy | apps/common/errors.py:64 |
OTPCooldown |
software | healthy | apps/common/errors.py:70 |
EventFull |
software | healthy | apps/common/errors.py:76 |
Showing first 50 of this kind. Full payload available via the JSON button at the top of the page.
| Label | Layer | Status | Path |
|---|---|---|---|
tests |
software | healthy | tests |
.github |
software | healthy | .github |
workflows |
software | healthy | .github/workflows |
docs |
software | healthy | docs |
apps |
software | healthy | apps |
enrollments |
software | healthy | apps/enrollments |
migrations |
software | healthy | apps/enrollments/migrations |
accounts |
software | healthy | apps/accounts |
migrations |
software | healthy | apps/accounts/migrations |
common |
software | healthy | apps/common |
management |
software | healthy | apps/common/management |
commands |
software | healthy | apps/common/management/commands |
notifications |
software | healthy | apps/notifications |
migrations |
software | healthy | apps/notifications/migrations |
events |
software | healthy | apps/events |
migrations |
software | healthy | apps/events/migrations |
config |
software | healthy | config |
settings |
software | healthy | config/settings |
docker |
software | healthy | docker |
| Label | Layer | Status | Path |
|---|---|---|---|
ANY /api/enrollments |
api | healthy | apps/enrollments/urls.py |
ANY /api/auth/signup |
api | healthy | apps/accounts/urls.py |
ANY /api/auth/verify-email |
api | healthy | apps/accounts/urls.py |
ANY /api/auth/resend-otp |
api | healthy | apps/accounts/urls.py |
ANY /api/auth/login |
api | healthy | apps/accounts/urls.py |
ANY /api/auth/refresh |
api | healthy | apps/accounts/urls.py |
ANY /api/auth/me |
api | healthy | apps/accounts/urls.py |
ANY /healthz/ |
api | healthy | apps/common/urls.py |
ANY /api/events |
api | healthy | apps/events/urls.py |
ANY /admin/ |
api | healthy | config/urls.py |
ANY /api/auth/ |
api | healthy | config/urls.py |
ANY /api/ |
api | healthy | config/urls.py |
ANY /api/schema/ |
api | healthy | config/urls.py |
ANY /api/docs/ |
api | healthy | config/urls.py |
| Label | Layer | Status | Path |
|---|---|---|---|
__init__.py |
data | healthy | apps/enrollments/migrations/__init__.py |
0001_initial.py |
data | healthy | apps/enrollments/migrations/0001_initial.py |
__init__.py |
data | healthy | apps/accounts/migrations/__init__.py |
0001_initial.py |
data | healthy | apps/accounts/migrations/0001_initial.py |
0002_roles_and_email_unique.py |
data | healthy | apps/accounts/migrations/0002_roles_and_email_unique.py |
__init__.py |
data | healthy | apps/notifications/migrations/__init__.py |
0001_initial.py |
data | healthy | apps/notifications/migrations/0001_initial.py |
__init__.py |
data | healthy | apps/events/migrations/__init__.py |
0001_initial.py |
data | healthy | apps/events/migrations/0001_initial.py |
| Label | Layer | Status | Path |
|---|---|---|---|
image::Dockerfile |
hardware | healthy | Dockerfile |
db |
hardware | healthy | docker-compose.yml |
redis |
hardware | healthy | docker-compose.yml |
web |
hardware | healthy | docker-compose.yml |
worker |
hardware | healthy | docker-compose.yml |
beat |
hardware | healthy | docker-compose.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
postgres |
data | healthy | .env.example |
redis |
data | healthy | .env.example |
postgresql |
data | healthy | docker-compose.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
password_literal::tests/conftest.py |
security | healthy | tests/conftest.py |
password_literal::tests/factories.py |
security | healthy | tests/factories.py |
password_literal::apps/common/management/commands/seed_demo… |
security | healthy | apps/common/management/commands/seed_demo.py |
| Label | Layer | Status | Path |
|---|---|---|---|
auth::apps/accounts/serializers.py |
security | healthy | apps/accounts/serializers.py |
auth::tests/conftest.py |
security | healthy | tests/conftest.py |
auth::README.md |
security | healthy | README.md |
| Label | Layer | Status | Path |
|---|---|---|---|
port:5432 |
network | healthy | docker-compose.yml |
port:8000 |
network | healthy | docker-compose.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
lint |
cicd | healthy | .github/workflows/ci.yml |
test |
cicd | healthy | .github/workflows/ci.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
ben1441__ahoum-backend |
software | healthy | /data/fable5_failed_archive/ben1441__ahoum-backend |
| Label | Layer | Status | Path |
|---|---|---|---|
celery |
data | healthy | .env.example |
| Label | Layer | Status | Path |
|---|---|---|---|
TimeStampedModel |
data | healthy | apps/common/models.py |
| Label | Layer | Status | Path |
|---|---|---|---|
127.0.0.1 |
network | healthy | .env.example |
| Label | Layer | Status | Path |
|---|---|---|---|
gha::ci |
cicd | healthy | .github/workflows/ci.yml |
This page is publicly accessible at:
https://repobility.com/scan/caf57e2e-4503-4d2b-9ef6-fd4459653ada/
To check status programmatically (no auth required):
curl -s https://repobility.com/api/v1/public/scan/caf57e2e-4503-4d2b-9ef6-fd4459653ada/
Important — please don't re-submit the same URL repeatedly. The submission endpoint is idempotent: re-submitting the same git URL returns this same scan_token, not a new one. To re-scan this repo, sign up free and use the dashboard.