Däneker
Платформа, где бизнес через AI-интервью превращает исходное описание проблемы в структурированную карточку задачи, а студенческие команды находят её…
О проекте
Команда: Aliskander
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Платформа, где бизнес через AI-интервью превращает исходное описание проблемы в структурированную карточку задачи, а студенческие команды находят её в каталоге, откликаются и сдают результат по этапам.
Как устроено
Сервер на чистом Node.js (node:http, без npm-зависимостей) хранит данные в JSON-файле. AI-интервью задаёт 3–5 уточняющих вопросов и генерирует карточку через OpenAI Responses API со Structured Outputs (JSON Schema); публикует её только человек. Рейтинг полноты 0–100 и Match команды с задачей считаются детерминированными движками (CommonJS), общими для браузера и сервера, а LLM даёт только текстовые пояснения. Этапы с распределением 100 баллов, приёмка и возврат на доработку, роли и сессии на scrypt.
Ключевые решения
- Structured Outputs JSON Schema
- AI-интервью
- детерминированный readiness score
- детерминированный Match профиля и задачи
Особенности
Ноль внешних npm-зависимостей. Одни и те же движки рейтинга и Match работают на сервере и в браузере. Автономный demo.html и повторяемый сценарий защиты case.html без API-ключа.
Стек
Node.js · Vanilla JavaScript · HTML/CSS · node:test
Модели
gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-ba77eedd-aliskander.
README
README.mdDäneker — задачи бизнеса и решения студенческих команд
MVP-платформа, на которой бизнес формулирует проектную задачу, а студенческие команды находят подходящие кейсы, предлагают решения и поэтапно сдают результат.
О проекте
Бизнес-задачи часто приходят к студентам в виде короткого сообщения без контекста, критериев приёмки, доступных данных и ограничений. Из-за этого команде сложно оценить задачу и понять, какой результат нужен заказчику. В то же время бизнесу неудобно собирать и сравнивать предложения, а затем фиксировать прогресс проекта.
Däneker связывает две аудитории:
- бизнес — помогает превратить исходное описание в структурированную карточку, опубликовать её, сравнить предложения и принять результаты;
- студенческие команды — даёт каталог задач, профиль компетенций, объяснимую оценку соответствия и рабочий процесс по этапам.
Текущая версия является локальным MVP и учебной демонстрацией. Репозиторий не содержит подтверждений реального внедрения, реальных бронирований или измеренного бизнес-эффекта.
Что реализовано
Для бизнеса
- регистрация и вход с ролью бизнеса;
- создание черновика задачи и автосохранение изменений;
- AI-интервью из 3–5 уточнений и генерация структурированной карточки через OpenAI;
- явно обозначенный шаблонный режим уточнений в автономной демонстрации без API-ключа;
- ручное редактирование и подтверждение карточки перед публикацией;
- единый рейтинг полноты 0–100 с расшифровкой недостающих сведений;
- отдельная AI-проверка качества текста, не изменяющая детерминированный рейтинг;
- настройка 2–3 этапов проекта, критериев приёмки и распределения 100 баллов;
- просмотр и сравнение откликов, ручной выбор одной, нескольких или ни одной команды;
- приёмка результатов этапов либо возврат на доработку с комментарием.
Для студенческой команды
- регистрация и вход с ролью команды;
- профиль участников: роли, навыки, уровень, доступность, проекты и интересы;
- каталог опубликованных задач с поиском, фильтрами, сортировкой, пагинацией и закладками;
- детерминированная оценка соответствия профиля задаче и, при доступном OpenAI, текстовое пояснение;
- неограниченное число предложений с идеей, планом, сроком и необязательной ссылкой на прототип;
- снимок профиля и оценки соответствия на момент отклика;
- согласование плана, последовательная отправка этапов и просмотр обратной связи;
- добавление проекта в подтверждённый опыт после приёмки всех его этапов.
Безопасность и целостность данных
- серверная проверка ролей, владельца задачи и назначенной команды;
- пароли в виде salted
scrypt-хешей; - сессии в
HttpOnly,SameSite=Strictcookie на 12 часов; - ограничение попыток входа и запрет изменяющих запросов с другого origin;
- проверка входного JSON, размера запроса, ссылок и переходов между состояниями проекта.
Как работает решение
Основной пользовательский сценарий выглядит так:
- Представитель бизнеса регистрируется и вводит исходное описание проблемы.
- AI-интервью задаёт минимум три уточняющих вопроса. После ответов формируется черновик карточки; AI не публикует её автоматически.
- Пользователь проверяет и редактирует название, контекст, цель, ожидаемый результат, критерии успеха, данные, ограничения, аудиторию, контакт и формат взаимодействия. Рейтинг полноты пересчитывается общим детерминированным алгоритмом.
- Бизнес задаёт этапы и публикует карточку в каталоге.
- Команда заполняет профиль, находит задачу через поиск или фильтры, изучает оценку соответствия и отправляет предложение.
- Бизнес сравнивает предложения и подтверждает выбор. Для каждой выбранной команды создаётся отдельный набор этапов.
- Команда согласует план и по очереди прикладывает описание и ссылку на результат. Бизнес принимает этап или возвращает его на доработку.
- Баллы этапа считаются начисленными только после подтверждения бизнеса; следующий этап открывается после приёмки предыдущего.
Технологии
| Область | Используется в проекте |
|---|---|
| Backend | JavaScript, Node.js >=22.9, встроенные модули node:http, node:fs, node:crypto |
| Frontend | HTML5, CSS, Vanilla JavaScript, hash-навигация без frontend-фреймворка |
| Хранилище | JSON-файл data/db.json с атомарной заменой через временный файл |
| AI | OpenAI Responses API, Structured Outputs с JSON Schema; модель задаётся через OPENAI_MODEL, по умолчанию gpt-4o-mini |
| Авторизация | Собственная cookie-сессия, scrypt, randomUUID / randomBytes |
| Тестирование | Встроенный node:test, node:assert, интеграционные HTTP-тесты |
| Зависимости | Внешних npm-пакетов нет |
OpenAI используется только сервером: ключ не передаётся в браузер. Запросы к модели нужны для интервью, проверки качества карточки и пояснения оценки соответствия. Сам рейтинг полноты и числовой Match рассчитываются локальными детерминированными алгоритмами и не требуют AI.
Архитектура проекта
Браузер (public/)
├─ интерфейс каталога, карточек, профиля, откликов и этапов
├─ API-клиент основного приложения
└─ автономный demo.html с локальными учебными данными
│ HTTP / JSON
▼
Node.js HTTP-сервер (src/server.js)
├─ маршрутизация и раздача статических файлов
├─ авторизация и проверка прав (src/auth.js)
├─ бизнес-правила и персистентность (src/store.js)
├─ рейтинг полноты (src/rating.js + public/readiness-engine.cjs)
├─ Match команды и задачи (src/match.js + public/match-engine.cjs)
└─ AI-адаптер (src/ai.js) ───────────────► OpenAI Responses API
│
▼
data/db.json
Основные каталоги и файлы:
| Путь | Назначение |
|---|---|
src/server.js | HTTP-сервер, API-маршруты, статические файлы и проверки доступа |
src/store.js | операции с задачами, профилями, откликами, этапами и JSON-хранилищем |
src/auth.js | аккаунты, хеширование паролей и сессии |
src/ai.js | валидация AI-ввода/вывода и интеграция с OpenAI |
src/rating.js, src/presentation.js | расчёт и представление полноты карточки |
src/match.js | серверный адаптер алгоритма соответствия |
public/ | интерфейс, стили и переиспользуемые браузерные движки |
test/ | модульные и интеграционные тесты |
docs/ | контракт API и подробности отдельных подсистем |
Одни и те же CommonJS-совместимые движки из public/ переиспользуются сервером и браузером, поэтому рейтинг, этапы, каталог и Match следуют одинаковым правилам в интерфейсе и API.
Установка и запуск
Требования
- Node.js 22.9 или новее;
- современный браузер;
- опционально — ключ OpenAI API для живого AI-интервью и AI-подсказок.
Локальный запуск
-
Клонируйте репозиторий и перейдите в него:
git clone <URL-РЕПОЗИТОРИЯ> cd hack-ba77eedd-aliskander -
Проверьте версию Node.js:
node --version -
Если нужен живой OpenAI, создайте локальный файл настроек:
cp .env.example .envЗатем заполните
OPENAI_API_KEYв.env. При необходимости изменитеOPENAI_MODELиPORT. Файл.envисключён из Git. Не добавляйте API-ключ в клиентский код или коммиты. -
Запустите приложение:
npm startУстановка пакетов не требуется: в проекте нет внешних npm-зависимостей.
-
Откройте http://localhost:3000. Сервер слушает loopback-интерфейс
127.0.0.1; порт по умолчанию —3000.
При первом запуске data/db.json создаётся автоматически и получает две учебные задачи и три предложения. Можно указать другой путь переменной DATA_FILE. После изменения .env перезапустите сервер.
Полезные страницы
| URL | Назначение |
|---|---|
http://localhost:3000/ | основное приложение с реальными серверными аккаунтами и данными |
http://localhost:3000/demo.html | автономная демонстрация с переключением ролей и локальными данными |
http://localhost:3000/case.html | повторяемый сценарий защиты на учебном кейсе |
http://localhost:3000/prototype.html?variant=grid | учебный прототип записи, вариант «сетка» |
http://localhost:3000/prototype.html?variant=list | тот же прототип, вариант «список» |
Как проверить решение
Быстрый сценарий для жюри
Этот сценарий не требует API-ключа и не изменяет серверное хранилище:
- Запустите
npm start. - Откройте
http://localhost:3000/case.htmlи ознакомьтесь с учебным кейсом студии «Форма». - Нажмите «Открыть кейс»: откроется отдельная демонстрация полного потока с локальными данными.
- Переключайтесь между ролями бизнеса и команды и пройдите цепочку: карточка задачи → предложения → выбор команды → этапы → отправка и приёмка результата.
- На странице кейса откройте учебный прототип и проверьте запись на свободный сеанс, недоступность занятого сеанса, отмену и сохранение состояния после обновления страницы. Прототип использует только
localStorageи не бронирует реальные услуги.
Проверка основного защищённого потока
- Откройте
/и зарегистрируйте аккаунт с ролью «Бизнес». - Создайте задачу, ответьте минимум на три уточнения, проверьте карточку и опубликуйте её. Без ключа OpenAI для гарантированного показа интервью используйте
/demo.html; основной AI endpoint сообщит, что провайдер не настроен. - Выйдите и зарегистрируйте второй аккаунт с ролью студенческой команды.
- Заполните профиль, найдите опубликованную задачу, добавьте её в закладки и отправьте предложение.
- Вернитесь в аккаунт бизнеса, выберите предложение.
- В аккаунте команды согласуйте этапы и отправьте первый результат с корректной ссылкой
http://илиhttps://. - В аккаунте бизнеса примите этап либо верните его на доработку и убедитесь, что следующий этап нельзя сдать раньше предыдущего.
Автоматические проверки
npm test
npm run lint
Тесты OpenAI используют подменённые ответы и не расходуют API. Проверить настоящий ключ и доступность выбранной модели можно отдельно:
npm run verify:openai
Команда verify:openai требует заполненного .env и выполняет реальный запрос к OpenAI.
Данные и интеграции
Локальные данные
- Основные аккаунты, задачи, профили, закладки, предложения и этапы сохраняются в
data/db.jsonили в файле изDATA_FILE. - Каталог при первом запуске получает учебные данные из
src/sample-data.js. demo.htmlработает отдельно от защищённого API и хранит демонстрационное состояние в браузере.- Учебный прототип записи хранит записи в
localStorage; персональные данные ему не нужны.
Внешние сервисы
Единственная внешняя интеграция в репозитории — OpenAI Responses API (https://api.openai.com/v1/responses). Она опциональна: каталог, аккаунты, публикация, отклики, этапы, рейтинг полноты и числовой Match работают без неё. Репозиторий не содержит интеграций с CRM, мессенджерами, OAuth, платёжными системами или внешними базами данных.
Подробные контракты находятся в документации:
- API и сопоставление полей;
- AI-интервью и генератор карточки;
- формула соответствия команды задаче;
- каталог и фильтры;
- сценарий проверки жюри и границы MVP.
Ограничения текущей версии
- Сервер и файловое хранилище рассчитаны на один процесс; конкурентный многопроцессный доступ к JSON-файлу не поддерживается.
- Сессии находятся в памяти: после перезапуска сервера нужно войти снова, хотя аккаунты и проектные данные сохраняются.
- Нет восстановления пароля, подтверждения email, OAuth и приглашений отдельных участников команды.
- Нет push/email/мессенджер-уведомлений и интеграций с внешними бизнес-системами.
- Рейтинг 0–100 оценивает заполненность карточки по фиксированным правилам, а не достоверность или бизнес-ценность текста.
- Match является рекомендательным: он использует заявленные в профиле сведения, не проверяет владение навыками и не выбирает команду вместо бизнеса.
- OpenAI-функции требуют серверного
OPENAI_API_KEY, доступа в интернет и доступности указанной модели. Ошибка провайдера не подменяется успешным AI-ответом. - Старые задачи без владельца сохраняются, но не назначаются новому аккаунту; для управляемого показа следует создать новую задачу или использовать автономное демо.
- Учебный прототип записи не является production-сервисом и не выполняет реальные бронирования.
Deployed-версия
Ссылка на развёрнутую публичную версию не указана в репозитории. Проект подтверждённо запускается локально по адресу http://localhost:3000.
Авторы коммитов
История коммитов
- 2026-09-23 17:51Merge pull request #17 from BAITC-Hacks/y79yd1-codex/-readme.mdk771en
- 2026-09-23 17:50docs: expand Russian project READMEk771en
- 2026-09-23 17:43Merge pull request #16 from BAITC-Hacks/fy4z5j-codex/-danekerk771en
- 2026-09-23 17:43Rename platform to Dänekerk771en
- 2026-09-23 17:43Delete ForCodek771en
- 2026-09-23 17:43Delete Инструкция по кибербезопасности.pdfk771en
- 2026-09-23 17:42Delete Снимок экрана 2026-09-23 в 13.47.29.pngk771en
- 2026-09-23 17:30Merge pull request #15 from BAITC-Hacks/fix/readiness-filler-validationk771en
Все коммиты (53)
- 2026-09-23 17:29Reject readiness filler and explain unearned pointsAliKenzh
- 2026-09-23 17:22Merge pull request #14 from BAITC-Hacks/feat/edit-published-taskk771en
- 2026-09-23 17:21Allow owners to edit published tasks before team selectionAliKenzh
- 2026-09-23 17:20Merge pull request #13 from BAITC-Hacks/codex-zkqcuik771en
- 2026-09-23 17:20Harden readiness scoring and AI fact groundingk771en
- 2026-09-23 17:01Merge pull request #12 from BAITC-Hacks/fix/jury-review-flowk771en
- 2026-09-23 17:01Clarify team profile migration in match documentationAliKenzh
- 2026-09-23 16:59Align account form and integration documentationAliKenzh
- 2026-09-23 16:58Merge latest team interview fix and verify demo caseAliKenzh
- 2026-09-23 16:56Unify readiness and complete accountable team workflowAliKenzh
- 2026-09-23 16:31Merge pull request #11 from BAITC-Hacks/cz6pzt-codexk771en
- 2026-09-23 16:30Не отклонять третий ответ AI-интервьюk771en
- 2026-09-23 16:30Merge pull request #10 from BAITC-Hacks/feature/explore-task-catalogk771en
- 2026-09-23 16:09Merge remote-tracking branch 'origin/main' into feature/explore-task-catalogAliKenzh
- 2026-09-23 16:09Add Explore Tasks catalog with filters, saved tasks and paginationAliKenzh
- 2026-09-23 16:02Add API client integrationkhNurda
- 2026-09-23 16:00Merge pull request #9 from BAITC-Hacks/codex-4h6erzk771en
- 2026-09-23 15:59Оценивать готовность задачи с помощью ИИk771en
- 2026-09-23 15:44Merge pull request #7 from BAITC-Hacks/feature/student-ai-matchk771en
- 2026-09-23 15:41Подключить ИИ-оценку готовности задачk771en
- 2026-09-23 15:34Add deterministic student Match scoring and profile comparisonAliKenzh
- 2026-09-23 15:14Merge pull request #6 from BAITC-Hacks/feature/ai-task-interviewk771en
- 2026-09-23 15:07Merge latest main and preserve startup sample dataAliKenzh
- 2026-09-23 15:06Add OpenAI task interview and editable AI task generatorAliKenzh
- 2026-09-23 15:00Delete HackAlem AI_ кейс по геймификации практических заданий.docxkhNurda
- 2026-09-23 15:00Merge branch 'main' of github.com:BAITC-Hacks/hack-ba77eedd-aliskanderkhNurda
- 2026-09-23 14:53Merge pull request #4 from BAITC-Hacks/codexk771en
- 2026-09-23 14:51Добавить примеры задач и решенийk771en
- 2026-09-23 14:37Merge pull request #3 from BAITC-Hacks/frontend/requirements-checklistk771en
- 2026-09-23 14:35Create HackAlem AI_ кейс по геймификации практических заданий.docxkhNurda
- 2026-09-23 14:34Delete HackAlem AI_ кейс по геймификации практических заданий.docxkhNurda
- 2026-09-23 14:34Complete task fields, readiness filters and per-proposal decisionsAliKenzh
- 2026-09-23 14:23Merge pull request #2 from BAITC-Hacks/frontend/most-api-integrationk771en
- 2026-09-23 14:23Create ~$ckAlem AI_ кейс по геймификации практических заданий.docxkhNurda
- 2026-09-23 14:23Create HackAlem AI_ кейс по геймификации практических заданий.docxkhNurda
- 2026-09-23 14:15Integrate Most interface with team API and persistent progressAliKenzh
- 2026-09-23 14:15Merge remote-tracking branch 'origin/main'AliKenzh
- 2026-09-23 14:09Add files via uploadNurdaulet362
- 2026-09-23 14:04Build Most frontend prototype and live editorAliKenzh
- 2026-09-23 13:54Create ForCodeNurdaulet362
- 2026-09-23 13:52Merge branch 'main' of https://github.com/BAITC-Hacks/hack-ba77eedd-aliskanderkhNurda
- 2026-09-23 13:50Merge pull request #1 from BAITC-Hacks/k771en-patch-1k771en
- 2026-09-23 13:49Add files via uploadk771en
- 2026-09-23 13:40Update README.mdkhNurda
- 2026-09-23 12:59Update README.mdkhNurda
Структура репозитория (52 файлов)
.env.example .gitignore README.md docs/ai-match.md docs/ai-task-generator.md docs/api-contract.md docs/frontend-scope.md docs/jury-review.md docs/task-catalog.md package.json public/ai-components.js public/ai-flow.js public/api-client.js public/app.js public/auth-ui.js public/case-data.js public/case.html public/catalog-components.js public/catalog-demo.cjs public/catalog-engine.cjs public/catalog-page.js public/demo-ai.js public/demo-api.js public/demo.html public/draft-autosave.js public/index.html public/interview-rules.cjs public/match-demo.cjs public/match-engine.cjs public/match-ui.js public/milestones.cjs public/prototype.html public/readiness-engine.cjs public/review-editor.js public/styles.css public/team-session.js scripts/check-syntax.mjs scripts/verify-openai.mjs src/ai.js src/auth.js src/match.js src/presentation.js src/rating.js src/sample-data.js src/server.js src/store.js test/ai.test.js test/catalog.test.js test/integration.test.js test/match.test.js test/mvp.test.js test/review.test.js
Ветки (19)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.