Compare commits

...

11 Commits

Author SHA1 Message Date
vaskes fd1c85511d docs: log Sprint-0 session 2026-10-19
ci / check (push) Successful in 33s
2026-10-19 10:02:18 +03:00
vaskes e446ef5d25 docs: wire DevLog into Obsidian daily notes and Dataview 2026-10-19 10:02:18 +03:00
vaskes 581cc70020 docs: add session workflow note (lesson start/end prompts) 2026-10-19 10:02:18 +03:00
vaskes 1af250ad19 chore(skills): add lesson-plan and lesson-close project commands 2026-10-19 10:02:18 +03:00
vaskes b1577e23be docs: record chat-language agreement in Sprint-0 retro
ci / check (push) Successful in 1m1s
2026-10-18 18:20:14 +03:00
vaskes 1fc49df995 docs: close task 0001, log Sprint-0 session 2026-10-18 (#1, #2)
ci / check (push) Successful in 35s
2026-10-18 18:09:14 +03:00
vaskes 1cdd0fd512 Merge pull request '1 bootstrap cargo project skeleton' (#13) from 1-bootstrap-cargo-project-skeleton into main
ci / check (push) Successful in 2m42s
- #1
- #2
2026-10-18 14:59:18 +00:00
vaskes fd57c2556d ci: fix paypline
ci / check (push) Successful in 3m27s
2026-10-18 17:52:04 +03:00
vaskes c9116c1742 ci: fix paypline
ci / check (push) Failing after 5s
2026-10-18 14:05:27 +03:00
vaskes 00ef64654e ci: add Gitea Actions workflow with fmt, clippy and test (#2)
ci / check (push) Failing after 3m52s
2026-10-18 13:47:48 +03:00
vaskes 20dcc4f20d feat: bootstrap viexp crate with lib/bin split and sanity test (#1) 2026-10-18 13:46:58 +03:00
16 changed files with 311 additions and 10 deletions
+29
View File
@@ -0,0 +1,29 @@
---
name: lesson-close
description: Close a finished viexp practice session — write today's DevLog entry, record ErrorJournal cues, update the sprint note (hours-logged, checkboxes) and bring task-note statuses in line with reality. Use at the end of a practice session, when the user says the lesson is over, «закрой урок», «конец урока», or invokes /lesson-close. Show the diff and never commit — the owner reviews and commits.
---
# Lesson close
Turn the finished session into the vault artifacts. Answer in Russian — the chat language
per the Sprint-0 retro agreement; artifact content is English (hard repo rule).
## Steps
1. DevLog: create or update today's `docs/devlog/YYYY-MM-DD.md` following the
`TMP/DevLog.md` template — what was done, frustrations, English practice (2–3 words
actually met this session), Next session.
2. ErrorJournal: append today's compiler/tool errors with a self-correction cue, if any
occurred this session (`TMP/ErrorJournal.md` pattern). Skip silently if there were none.
3. Sprint note: update `hours-logged` and tick the checkboxes that this session's
demoable results actually cover.
4. Task notes: bring `status:` fields in line with reality (a task with all acceptance
criteria met but uncommitted goes to `review`, not `done` — see docs/tasks/0001 for
the done pattern).
## Rules
- Show the resulting diff summary in chat — the owner reviews and commits personally.
Never commit or push on your own.
- If a step has nothing to record, say so in one line instead of inventing content.
- Update only what this session actually touched; do not backfill older notes.
+43
View File
@@ -0,0 +1,43 @@
---
name: lesson-plan
description: Build today's viexp practice-session plan from the vault itself (active sprint note, latest DevLog "Next session", open tasks and milestone issues). Use at the start of any practice session in this repo — when the user asks for a lesson plan, «план урока», «план на сегодня», or invokes /lesson-plan. Produce the plan only and never start the work before an explicit go-ahead.
---
# Lesson plan
Assemble today's lesson plan so the owner does not spend session time planning or drift
from the methodology (sprint rhythm 5/30/10, one drill = one commit). Answer in Russian —
the chat language per the Sprint-0 retro agreement; keep the section headers exactly as
given below.
## Gather the context yourself
1. Active sprint: the note in `docs/sprints/` with `status: active` in frontmatter.
2. The latest `docs/devlog/*.md` by date — its «Next session» section.
3. Open tasks of that sprint: `docs/tasks/` notes with `status: todo | in-progress | blocked`.
4. Open issues of the sprint's milestone via `tea` (see docs/workflows/gitea-workflow.md
for the quirks; `scripts/gitea-issues.sh` maps label names to IDs). If `tea` fails or
is slow, fall back to the task notes and say so.
## Answer strictly in this format
```text
Где мы — 2–3 строки: последний коммит, что осталось с прошлого урока.
Цель урока — одна фраза + номер task/issue.
Дрели — 2–4 шт. по 20–30 мин, каждая: название / что делаю /
критерий готовности (демонстрируемый результат). Размер дрели = один коммит.
Финал — последние 10 минут: DevLog, ErrorJournal, синхронизировать доску.
Бюджет урока: __ мин — сумма дрелей плюс финал не превышает бюджет.
```
If the user passed a number with the command (e.g. `/lesson-plan 45`), use it as the
budget; otherwise leave `__ мин` for the owner to fill.
## Rules
- If the drills do not fit the budget, cut the number of drills — never shorten a drill
below 20 minutes.
- If something is missing or unclear, pick an obvious default, mark it «допущение», and
move on — do not ask questions.
- Until the owner replies «поехали» (or corrects a point), do nothing: no file edits, no
commits, no issue changes.
+13
View File
@@ -0,0 +1,13 @@
name: ci
on: [push]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- run: cargo fmt --check
- run: cargo clippy -- -D warnings
- run: cargo test
+5
View File
@@ -23,3 +23,8 @@ Thumbs.db
*.swp *.swp
*.swo *.swo
*~ *~
# Added by cargo
/target
Generated
+7
View File
@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "viexp"
version = "0.1.0"
+7
View File
@@ -0,0 +1,7 @@
[package]
name = "viexp"
version = "0.1.0"
edition = "2024"
license = "GPL-3.0-or-later"
[dependencies]
+10
View File
@@ -11,6 +11,16 @@ tags: [devlog]
## What I did ## What I did
- -
## Files touched today
```dataview
TABLE WITHOUT ID file.link AS "Note", file.mtime AS "Modified"
WHERE file.mtime >= date(this.file.name) AND file.mtime < date(this.file.name) + dur(1d)
AND file.path != this.file.path
AND file.folder != "TMP"
SORT file.mtime DESC
```
## Code review notes ## Code review notes
Reviewer feedback and what I changed because of it. Reviewer feedback and what I changed because of it.
+30
View File
@@ -0,0 +1,30 @@
---
type: devlog
date: 2026-10-18
sprint: 0
minutes: 75
tags: [devlog]
---
# Dev log — 2026-10-18
## What I did
- Task 0001 done (issues #1, #2): cargo skeleton with lib/bin split, one sanity test,
and `.gitea/workflows/ci.yaml` running fmt/clippy/test on push.
- Learned `cargo init` vs `cargo new`; rewrote first commits into Conventional Commits
and pushed the branch.
- First CI debugging: two red runs fixed by adding `dtolnay/rust-toolchain@stable`;
then a red run on `main` caused by a flaky toolchain download — a rerun went green.
- Merged PR #13 into `main`; closed issues #1 and #2.
## Frustrations
- Reading English text (docs, CI logs) takes too much of the session — to discuss at retro.
## English practice
- *pipeline* — конвейер CI; *the pipeline runs fmt, clippy and test*.
- *flaky* — нестабильный (то падает, то нет); *the runner's network is flaky*.
- *rerun* — повторный запуск; *a rerun of the failed job went green*.
## Next session
- Install `bacon` (task 0002, drill D1) and verify the fast-feedback loop.
- Drill D3: three deliberate compiler errors into the ErrorJournal.
+54
View File
@@ -0,0 +1,54 @@
---
type: devlog
date: 2026-10-19
sprint: 0
minutes: 45
tags: [devlog]
---
# Dev log — 2026-10-19
## What I did
- Task 0002 (issue #3): verified the toolchain and set up the fast-feedback loop.
Decision: stay on the Arch pacman `rust` package (1.99.0, clippy/rustfmt included) —
rustup would duplicate what pacman already manages.
- Installed bacon 3.26.0 and added `bacon.toml`: default job `check`, `clippy` pinned to
`-- -D warnings` (CI parity). The built-in `clippy` job does NOT fail on warnings —
list the effective jobs (`bacon --list-jobs`) instead of trusting defaults.
- Verified the watch loop with an inject/revert probe: clean → warning shown → clean
again. rust-analyzer works on the project; local baseline green (fmt/clippy/test).
- Recovered the lost "lesson prompts" side chat from the local ZCode session database;
wrote [[workflows/session-workflow|session-workflow]] and turned both prompts into
project commands (`/lesson-plan`, `/lesson-close` in `.agents/skills/`).
- Wired DevLog into Obsidian: Daily notes (folder `docs/devlog`, template `TMP/DevLog.md`)
and a Dataview "Files touched today" table.
## Files touched today
```dataview
TABLE WITHOUT ID file.link AS "Note", file.mtime AS "Modified"
WHERE file.mtime >= date(this.file.name) AND file.mtime < date(this.file.name) + dur(1d)
AND file.path != this.file.path
AND file.folder != "TMP"
SORT file.mtime DESC
```
## Code review notes
Reviewer feedback and what I changed because of it.
## Rust notes
Tooling day — no new Rust syntax; the compiler never got a chance to complain.
## English practice
New words and phrases I used today:
- *watch mode* — режим слежения; *bacon re-runs the checks on every save in watch mode*.
- *parity* — соответствие, одинаковость; *the clippy job now has parity with CI*.
- *headless* — без интерфейса; *I verified the jobs headless, without the TUI*.
- *recover* — восстанавливать; *I recovered the lost conversation from the local database*.
## Next session
- Try `/lesson-plan 45` in a fresh session; adjust the command if the plan shape is off.
- Drill D3: three deliberate compiler errors (E0382, E0308, E0384) into the ErrorJournal
with self-correction cues.
- Merge session-workflow + skills commits are on `main` — push when ready; then Sprint-0
retro and close-out.
+1
View File
@@ -10,6 +10,7 @@ of the repository.
- [[workflows/research-workflow|Research workflow]] — how we collect and analyze research artifacts - [[workflows/research-workflow|Research workflow]] — how we collect and analyze research artifacts
- [[workflows/gitea-workflow|Gitea workflow]] — how the board, labels, milestones and issues are organized - [[workflows/gitea-workflow|Gitea workflow]] — how the board, labels, milestones and issues are organized
- [[workflows/english-workflow|English workflow]] — how the project doubles as English practice - [[workflows/english-workflow|English workflow]] — how the project doubles as English practice
- [[workflows/session-workflow|Session workflow]] — the two ritual prompts that open and close every practice session
## Folders ## Folders
+12 -4
View File
@@ -5,7 +5,7 @@ status: active
started: 2026-10-17 started: 2026-10-17
finished: finished:
hours-planned: 6 hours-planned: 6
hours-logged: 2 hours-logged: 3
tags: [sprint, setup] tags: [sprint, setup]
--- ---
@@ -27,12 +27,15 @@ sprint, a practice session starts in 60 seconds and never touches configuration.
## Practice drills (20–30 min each) ## Practice drills (20–30 min each)
- [ ] D1 — Install/verify: `rustup default stable`, `cargo --version`; run `rustup component - [ ] D1 — Install/verify: `rustup default stable`, `cargo --version`; run `rustup component
add clippy rustfmt`; install `bacon` (`cargo install --locked bacon`). add clippy rustfmt`; install `bacon` (`cargo install --locked bacon`).
- [ ] D2 — `cargo new viexp --bin`, add a `lib.rs` skeleton (src split: `main.rs` calls - [x] D2 — `cargo new viexp --bin`, add a `lib.rs` skeleton (src split: `main.rs` calls
`viexp::run()`), one `#[test] fn sanity()` — make it fail, read the output, make it pass. `viexp::run()`), one `#[test] fn sanity()` — make it fail, read the output, make it pass.
(Done 2026-10-18: used `cargo init` in the existing repo; task 0001.)
- [ ] D3 — Break it on purpose: introduce E0382 (move a `String`, then use it), E0308 (wrong - [ ] D3 — Break it on purpose: introduce E0382 (move a `String`, then use it), E0308 (wrong
type), E0384 (reassign immutable). Paste each into the ErrorJournal **with a self-correction cue**. type), E0384 (reassign immutable). Paste each into the ErrorJournal **with a self-correction cue**.
- [ ] D4 — Gitea CI: `.gitea/workflows/ci.yml` running `fmt --check`, `clippy -D warnings`, - [x] D4 — Gitea CI: `.gitea/workflows/ci.yml` running `fmt --check`, `clippy -D warnings`,
`test`. Push and watch it go green. `test`. Push and watch it go green.
(Done 2026-10-18: green on `main` after PR #13; needed `dtolnay/rust-toolchain@stable`
and one rerun — runner network to static.rust-lang.org is flaky.)
- [x] D5 — Gitea board: labels, milestone "Sprint 1", issues imported from Sprint-1 DoD. - [x] D5 — Gitea board: labels, milestone "Sprint 1", issues imported from Sprint-1 DoD.
(Done 2026-10-17: 11 labels, 13 sprint milestones, issues #1–#12; kanban board still needs (Done 2026-10-17: 11 labels, 13 sprint milestones, issues #1–#12; kanban board still needs
one-time manual creation in the web UI — Gitea 1.26.2 has no projects API.) one-time manual creation in the web UI — Gitea 1.26.2 has no projects API.)
@@ -46,12 +49,17 @@ Conventional Commits, imperative mood.
## Definition of done ## Definition of done
- [ ] `cargo bacon` shows check+test passing on save - [ ] `cargo bacon` shows check+test passing on save
- [ ] CI green on `main` - [x] CI green on `main` (2026-10-18, run #14)
- [ ] ErrorJournal has ≥3 entries with cues - [ ] ErrorJournal has ≥3 entries with cues
- [ ] Sprint-1 milestone and issues exist on Gitea - [ ] Sprint-1 milestone and issues exist on Gitea
- [ ] Retro filled - [ ] Retro filled
## Retrospective ## Retrospective
### Shipped ### Shipped
- Task 0001 / issues #1–#2: cargo skeleton (lib/bin split, sanity test) + CI green on `main`
via PR #13.
### Frustrations ### Frustrations
- Reading English text (docs, tool output) eats a lot of session time. Agreed
(2026-10-18): theory digests stay short and in Russian in chat; English lives only
in artifacts (vault notes, code, commits, CI logs).
### Hours logged / English notes ### Hours logged / English notes
@@ -1,10 +1,11 @@
--- ---
type: task type: task
status: todo status: done
priority: P0 priority: P0
sprint: 0 sprint: 0
gitea-issue: "#1" gitea-issue: "#1, #2"
created: 2026-10-17 created: 2026-10-17
finished: 2026-10-18
due: due:
tags: [task, ci] tags: [task, ci]
--- ---
@@ -15,13 +16,17 @@ tags: [task, ci]
A compiling `viexp` crate with lib/bin split, one passing test, and green Gitea Actions CI. A compiling `viexp` crate with lib/bin split, one passing test, and green Gitea Actions CI.
## Acceptance criteria ## Acceptance criteria
- [ ] `cargo new`-style skeleton: `src/main.rs` + `src/lib.rs` (`main` calls `viexp::run()`) - [x] `cargo new`-style skeleton: `src/main.rs` + `src/lib.rs` (`main` calls `viexp::run()`)
- [ ] `cargo test` green with one sanity test - [x] `cargo test` green with one sanity test
- [ ] `.gitea/workflows/ci.yml`: `fmt --check` + `clippy -D warnings` + `test` on push - [x] `.gitea/workflows/ci.yaml`: `fmt --check` + `clippy -D warnings` + `test` on push
- [ ] First Conventional Commit pushed to `main` (with `dtolnay/rust-toolchain@stable`; file is `.yaml`, same thing)
- [x] First Conventional Commit pushed to `main` (merged via PR #13; CI green, run #14)
## Notes ## Notes
Rust Book ch. 1–2; see [[sprints/sprint-00-setup|Sprint 0]] drill D2/D4. Rust Book ch. 1–2; see [[sprints/sprint-00-setup|Sprint 0]] drill D2/D4.
## Log ## Log
- 2026-10-17 — task created. - 2026-10-17 — task created.
- 2026-10-18 — done. Drills D2+D4: skeleton, sanity test, CI workflow. Two CI fix commits
(added the rust-toolchain step), merged to `main` via PR #13. Run #14 red → rerun green:
the runner's download from static.rust-lang.org timed out once (flaky network, not code).
+10
View File
@@ -8,6 +8,16 @@ Rust is learned through English, English through Rust.
- **Commit messages in English** — Conventional Commits format forces short, structured sentences. - **Commit messages in English** — Conventional Commits format forces short, structured sentences.
- **DevLog entry** (10 min, last step of every session): 3–5 sentences about what you did, - **DevLog entry** (10 min, last step of every session): 3–5 sentences about what you did,
in English. Don't translate from Russian in your head — describe the code, not the feelings. in English. Don't translate from Russian in your head — describe the code, not the feelings.
Obsidian **Daily notes** is wired to this habit: folder `docs/devlog`, filename `YYYY-MM-DD`,
template `TMP/DevLog.md` — open today's note via the ribbon calendar icon or the command
palette ("Daily notes: Open today's daily note"). The config lives in `.obsidian/`
(gitignored), so re-create it manually on a new machine.
- Each DevLog auto-renders a **"Files touched today" table** (Dataview community plugin, v0.5.70,
installed in `.obsidian/plugins/dataview/`). The query filters by `file.mtime` inside the day
taken from the note's own filename, so every past entry shows its own day, not "today".
Caveat: `mtime` shows the *last* touch — a note edited again later moves to the newer day's
table. For the true change history of code files (`.rs` is not indexed by Dataview) use git:
`git log --since="00:00" --name-only --pretty=format:`.
- **Read error messages and docs in English only.** Never switch the compiler or Rust Book to Russian. - **Read error messages and docs in English only.** Never switch the compiler or Rust Book to Russian.
## Weekly habits ## Weekly habits
+65
View File
@@ -0,0 +1,65 @@
# Session workflow
Two ritual prompts bookend every practice session: the assistant assembles the lesson plan
from the vault itself (sprint note, DevLog, open tasks), and closes the session by writing
the artifacts back. Planning stops being a manual step that eats lesson time and drifts
from the methodology (sprint rhythm 5/30/10, one drill = one commit).
The vault keeps the English canonical version. Ready-to-paste Russian originals (the chat
language) are kept outside the repo at `~/.local/share/viexp/session-prompts-ru.md` — the
vault itself is English-only, and `TMP/` is tracked in git despite the name. The English
prompts below are also safe to paste as-is.
In ZCode both rituals are project commands, no pasting needed: `/lesson-plan [budget-min]`
and `/lesson-close` (defined in `.agents/skills/`).
## Session-start prompt
Paste as the first message of a new chat. Fill in the lesson budget; the assistant replies
with the plan only and waits for a go-ahead.
```text
viexp lesson — prepare today's plan. Plan only, do not start the work.
Gather the context yourself:
1. Active sprint: docs/sprints/ with status: active.
2. The latest docs/devlog/*.md by date — its "Next session" section.
3. Open tasks of the sprint: docs/tasks/ (status: todo | in-progress | blocked)
and open issues of the current milestone via tea.
Answer strictly in this format:
Where we are — 2–3 lines: last commit, what is left from the previous lesson.
Lesson goal — one phrase + task/issue number.
Drills — 2–4 × 20–30 min, each: name / what I do / done-when (demoable
result). One drill = one commit.
Wrap-up — last 10 minutes: DevLog, ErrorJournal, sync the board.
Lesson budget: __ min — drills plus wrap-up must fit the budget.
Rules:
- If it does not fit the budget, cut the number of drills, never the time of each.
- If something is missing or unclear — pick an obvious default, mark it
"assumption", do not ask questions.
- Until I reply "go" (or correct a point) — do nothing.
```
## Session-end prompt
Paste in the last ~10 minutes of the session; review the diff and commit yourself.
```text
Close the viexp lesson:
1. Create/update today's docs/devlog/ entry from the TMP/DevLog.md template:
what I did, frustrations, English practice, Next session.
2. ErrorJournal — today's errors with a self-correction cue, if any.
3. Sprint note: update hours-logged and checkboxes.
4. Bring task-note statuses in line with reality.
Show the changes — I will review and commit myself.
```
## Why it works this way
- **Fixed answer format** — the plan always has the same shape, so the methodology can't
drift: the assistant pulls "Next session" from the DevLog and open issues itself.
- **Planning is separated from work** — nothing happens before the explicit "go"; correcting
a plan point is cheaper than redoing a lesson mid-way.
- **The budget cuts scope, not depth** — fewer drills, never shorter drills.
+11
View File
@@ -0,0 +1,11 @@
pub fn run() {
print!("viexp {}", env!("CARGO_PKG_VERSION"));
}
#[cfg(test)]
mod tests {
#[test]
fn sanity() {
assert_eq!(2 + 2, 4);
}
}
+3
View File
@@ -0,0 +1,3 @@
fn main() {
viexp::run()
}