# Gemini Coding Assistant Project Guidelines

## High-Level Flow

Follow the following flow to implement any feature. Refer to each chapter of
this document for detailed guidelines.

1. Understand the requirements and Design the solution
2. Implement the solution and test it
3. Commit the code changes

Agent should not skip to next step without explicit permission from user.

## Understand the requirements and Design the solution

AI Agents should start in the design mode. In this mode, the agent should
understand the requirements and design the solution.

Agent should act as a senior software engineer to design the solution and reason
with the user.

Agent should use the following source as reference:

- workspace files
- Use the build.md to configure the Meson. Use the `subprojects` directory.
- Refer to the docker system file for include headers.

AI Agent should not use MCP commands unless user explicitly requests it.

The implementation plan should consist of the following:

- High level design
  - when my requirements are ambiguous, first ask, don't guess.
- step by step implementation plan
  - elaborate all impacted files and reason.
- test cases

AI Agent should save the implementation plan in the temporary markdown file.

## Implement the solution and test it

AI Agents should start in the implementation mode. In this mode, the agent
should implement the solution and test it.

AI Agent should act as a senior software engineer to implement the solution. If
the implementation plan needs to be revised, ask for user's approval first.

AI Agent should compile the code in the docker container based on `build.md` and
make sure the code compiles successfully.

AI Agent should use `.clang-format` to format the code before compiling.

AI Agent should create all unit tests under `tests/` directory. Then, it should
run all the tests in a clean docker container (with no cached artifacts).

If any unit test case fails, fix it and recompile, and test again. Agent should
not run shortcut and alter the test cases in the plan.

Setup a subagent based on the implementation plan and lesson.md file to review
the code changes.

## Local Presubmit and Commit

Before commit, run local presubmit test:

- Create a dummy commit (`git commit -m "temp: strip shmem"`) removing `shared_mem_dep` and `absl_status_dep` in root `meson.build`.
- Copy `common_clang_tidy_config.yaml` from Google3 Kokoro platform configs into the workspace root.
- Use the `openbmc/ubuntu-unit-test` Docker container (prioritize Google3 version).
- Use `openbmc-build-scripts` from `/openbmc_build_scripts/` under g3 third party or upstream OpenBMC.
- Run `run-unit-test-docker.sh` inside the docker container w/ `-c 1`.
- Drop dummy commit w/ `git reset --hard HEAD~1` upon completion.

Ask the user to provide the bug id.

The commit message should follow the OpenBMC git format:

- Title: `subsystem: short description` (<= 50 chars).
- Blank line.
- Body: Detailed explanation of why and what, wrapped at 72 chars.
- Footer: `Tested: <brief test performed>`
- Footer: `Google-Bug-Id: <bug id>`
- Footer: `Signed-off-by: Name <email>`

**Guidelines for Content:**

- **Highlight the Generic Idea**: Focus on the bug fix or the core feature.
  Explain the high-level design decisions.
- **Condense Implementation Details**: Do not include low-level details (like
  specific variable names, sentinel values, or small code changes) in the main
  body.
- **Use a 'Misc' Section**: Move unrelated or minor changes (like macro usage,
  timeout increases, formatting) to a separate `Misc:` section at the end of the
  body.

For example:

```text
benchmark: refine control plane benchmarks

Refined the control plane benchmarks to use full device paths in Flatten
model keys and 'contains'/'contained_by' edges in Graph model.

Signed-off-by: Hao Jiang <jianghao@google.com>
```

Using `@mcp:buganizer:` to upload the implmenetation plan to the bug.

- upon `git commit --amend`, update the implmenetation plan in the original
  comment number.
