docs: bench PV results 2026-05-20 PASS=20/20; misc updates
This commit is contained in:
@@ -235,3 +235,59 @@
|
||||
### Вывод
|
||||
- Текущий prompt уже работает на коротких и простых кейсах.
|
||||
- Следующий шаг — проверить его на более разнообразных задачах, чтобы убедиться, что шаблон не ломается за пределами приветствий.
|
||||
|
||||
---
|
||||
|
||||
## Итерация 9 (2026-05-19) — RUNTIME BUG DISCOVERY
|
||||
|
||||
### Источник
|
||||
Реальный прогон `test_heavy.sh` на кластере. Обнаружены критические баги в PHP и Node.js runtime-контракте.
|
||||
|
||||
### БАГ C: PHP `return array` → пустой response
|
||||
|
||||
**Задача LLM:** написать PHP-функцию.
|
||||
**Сгенерированный код (типичный):**
|
||||
```php
|
||||
<?php
|
||||
function handler(array $ctx): array {
|
||||
return ['statusCode' => 200, 'body' => json_encode(['tag' => 'ok'])];
|
||||
}
|
||||
```
|
||||
**Результат invoke:** `{"status":200,"response_raw":""}` — тело пустое.
|
||||
|
||||
**Причина:** PHP env (`ghcr.io/fission/php-env:latest`, server.php) создаёт `$response = new Response()`,
|
||||
вызывает функцию и возвращает оригинальный объект. Return value функции игнорируется.
|
||||
|
||||
**Правильный код:**
|
||||
```php
|
||||
<?php
|
||||
function handler($ctx) {
|
||||
$ctx["response"]->getBody()->write(json_encode(['tag' => 'ok']));
|
||||
}
|
||||
```
|
||||
|
||||
**Что изменено в промпте:**
|
||||
- PHP секция переписана: запрет на `return array`, требование писать через `$ctx["response"]->getBody()->write(...)`.
|
||||
- Добавлен пример с JSON-ответом и PSR-7 объектами.
|
||||
|
||||
---
|
||||
|
||||
### БАГ B: Node.js entrypoint `"main.js"` — split на точке → funcname="js"
|
||||
|
||||
**Проблема консоли, не пользовательского кода.**
|
||||
|
||||
Node-env `specializeV2` (строка 160 server.js) интерпретирует functionName через `split(".")`:
|
||||
- `"main.js"` → `{filename:"main", funcname:"js"}` → ищет `module["js"]` → undefined → specialize 500.
|
||||
- `"main"` → `{filename:"main", funcname:undefined}` → берёт `default export` → работает.
|
||||
|
||||
**Fix в консоли:** `console/internal/runtime/entrypoint.go`, `DefaultEntrypoint("nodejs")` = `"main"`.
|
||||
|
||||
**Влияние на промпт:** никакого — это внутренняя проблема консоли. Пользовательский Node.js код пишется как обычно.
|
||||
|
||||
---
|
||||
|
||||
### Итог итерации 9
|
||||
- PHP промпт обновлён: PSR-7 `getBody()->write()` вместо `return array`.
|
||||
- Node.js промпт уточнён: `module.exports = async function(ctx) {...}`, CJS стиль.
|
||||
- Документация: `doc/RUNTIME_FUNCTION_GUIDE.md` — полный справочник контрактов.
|
||||
|
||||
|
||||
@@ -54,9 +54,31 @@
|
||||
- Не ломай контракт функции выдуманными обертками или неподходящими типами.
|
||||
|
||||
### PHP
|
||||
- Возвращай корректный PHP-код функции.
|
||||
- Следи за открывающим тегом и синтаксисом массива/строк.
|
||||
- Не выдумывай несуществующие `Fission\\Contract` классы или SDK, если задача про обычную функцию.
|
||||
- **КРИТИЧНО:** PHP env НЕ читает return value функции. `return ['statusCode'=>200,'body'=>...]` — тело ответа будет ПУСТЫМ.
|
||||
- Запись в ответ — ТОЛЬКО через `$ctx["response"]->getBody()->write(...)`:
|
||||
```php
|
||||
<?php
|
||||
function handler($ctx) {
|
||||
$ctx["response"]->getBody()->write(json_encode(['key' => 'value']));
|
||||
}
|
||||
```
|
||||
- Сигнатура: `function handler($ctx)` — без type hint `array` и без `: array` return type.
|
||||
- Доступ к запросу: `$ctx["request"]`, к логгеру: `$ctx["logger"]`.
|
||||
- Открывающий тег `<?php` обязателен.
|
||||
- Не выдумывай несуществующие `Fission\\Contract` классы или SDK.
|
||||
- Альтернатива (только если нет доступа к request): простой `echo` без объявления функции handler:
|
||||
```php
|
||||
<?php
|
||||
echo json_encode(['key' => 'value']);
|
||||
```
|
||||
|
||||
### Node.js
|
||||
- Пользовательский код оборачивается консолью в CJS wrapper. Писать как обычный CommonJS.
|
||||
- Экспорт: `module.exports = async function(ctx) { return { status: 200, body: "..." }; }`
|
||||
- Формат ответа: объект `{ status: число, body: строка }`.
|
||||
- **НЕ** использовать `export default` — код запускается в CJS контексте.
|
||||
- **НЕ** указывать `.js` в entrypoint — это внутренняя настройка консоли, не пользовательский код.
|
||||
- Не вставляй ESM import/export обвязку в пользовательский код.
|
||||
|
||||
### Ruby
|
||||
- Возвращай корректный Ruby-код функции.
|
||||
|
||||
Reference in New Issue
Block a user